【问题标题】:Use derived class in base class while derived class is declared after the base class在基类中使用派生类,而派生类在基类之后声明
【发布时间】:2017-07-04 04:09:36
【问题描述】:

我有头文件

#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&lt;Rule&gt; 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

我该如何解决这个问题?

【问题讨论】:

  • 为什么Rule 必须继承自CategoryCategorys 包含 Rules 的接缝并不意味着 Rule 必须是派生类。
  • 查看下面的答案。前向声明的意思是“会有一个名为 this 的类,但现在不用担心它是什么。”这允许您声明指向它的指针,但仅此而已 - 在正确声明之前,您不能引用类中的任何内容。

标签: c++ derived-class


【解决方案1】:

您可以对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

【讨论】:

    【解决方案2】:

    你可以转发声明类规则:

    #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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 2018-11-09
      相关资源
      最近更新 更多