2017-02-15 159 views
0

後宣佈我的頭文件使用在基類派生類,而派生類的基類

#ifndef CATEGORY_H 
#define CATEGORY_H 

#include <functional> 
#include <string> 
#include <vector> 

class Category 
{ 
    private: 
     std::string nameCategory; 
     std::vector<Rule> setOfRules; 
    protected: 
    public: 
     Category(); 
     Category(std::string nameCategory); 
     void setIndexBankAccountEntry(unsigned int iBankAccountEntry); 
}; 

class Rule : public Category 
{ 
    private: 
     std::function<void(int)> rule; 
    protected: 
    public: 
     Rule(); 
     Rule(std::function<void(int)> rule); 
}; 
#endif 

在該命令std::vector<Rule> setOfRules;給出Rule尚未宣佈的錯誤。

切換兩個類的聲明的順序給出

#ifndef CATEGORY_H 
#define CATEGORY_H 

#include <functional> 
#include <string> 
#include <vector> 

class Rule : public Category 
{ 
    private: 
     std::function<void(int)> rule; 
    protected: 
    public: 
     Rule(); 
     Rule(std::function<void(int)> rule); 
}; 

class Category 
{ 
    private: 
     std::string nameCategory; 
     std::vector<Rule> setOfRules; 
    protected: 
    public: 
     Category(); 
     Category(std::string nameCategory); 
     void setIndexBankAccountEntry(unsigned int iBankAccountEntry); 
}; 
#endif 

但後來我得到的錯誤expected class-name before ‘{’ token爲線class Rule : public Category

我該如何解決這個問題?

+1

爲什麼'Rule'已經從'Category'繼承?它的'Category's包含Rule並不意味着Rule的接縫需要是派生類。 – NathanOliver

+0

請參閱下面的答案。前瞻性聲明所說的是「將會有一個類叫做這個類,但現在不用擔心它是什麼。」這允許你聲明指向它的指針,但這是關於所有的 - 你不能在類中引用任何東西,直到它被正確聲明爲止。 – Mike

回答

2

您可以使用Rule類向前聲明(根據第一個例子)。

class Rule; 
class Category 
{ 
    private: 
     std::string nameCategory; 
     std::vector<Rule> setOfRules; 
    protected: 
    public: 
     Category(); 
     Category(std::string nameCategory); 
     void setIndexBankAccountEntry(unsigned int iBankAccountEntry); 
}; 
// class Rule definition here 

檢查here

0

您可以向前聲明類規則:

#ifndef CATEGORY_H 
#define CATEGORY_H 

#include <functional> 
#include <string> 
#include <vector> 

class Rule; // <-- here 

class Category 
{ 
    private: 
     std::string nameCategory; 
     std::vector<Rule> setOfRules; 
    protected: 
    public: 
     Category(); 
     Category(std::string nameCategory); 
     void setIndexBankAccountEntry(unsigned int iBankAccountEntry); 
}; 

class Rule : public Category 
{ 
    private: 
     std::function<void(int)> rule; 
    protected: 
    public: 
     Rule(); 
     Rule(std::function<void(int)> rule); 
}; 
#endif