2017-02-15 253 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