代码之家  ›  专栏  ›  技术社区  ›  Lion King

如何使类相互继承?

  •  0
  • Lion King  · 技术社区  · 6 年前

    ClassOne , ClassTwo 每个都在一个单独的文件中 .h .cpp 具体如下:

    // ClassOne.h file
    #include <ClassTwo.h>
    class ClassOne : public ClassTwo {
    protected:
        type m_string; // Required for "ClassTwo"
    }
    
    // ClassTwo.h file
    #include <ClassOne.h>
    class ClassTwo : public ClassOne {
    public:
        method1(); // <---|
        method2(); // <- Required to be available in class ClassOne.
        method3(); // <---|
    }
    

    正如您在前面的代码中所看到的,这两个类相互继承,但该代码会出现错误 error C2504: 'ClassOne': base class undefined error C2504: 'ClassTwo': base class undefined .

    如何使这两个类相互继承?

    0 回复  |  直到 6 年前
        1
  •  3
  •   Dmitry Kuzminov    6 年前

    也许CRTP能解决你的问题。首先,创建类 ClassOne 作为使用类型的模板 ClassTwo 最后被父类

    template<typename ClassTwo>
    class ClassOne
    {
    public:
        void methodOne() {
            if (you need to use methods of ClassTwo) 
                 static_cast<ClassTwo*>(this)->methodTwo();
        }
    };
    

    然后定义 二级 作为继承人 最后被父类 指定模板参数本身:

    class ClassTwo : public ClassOne<ClassTwo>
    {
    public:
        void methodTwo() {
            if (you need to use methods of ClassOne) 
                 methodOne();
        }
    };
    

    更新: 那是一个很难解决问题的办法。还有其他更简单的方法,例如使用虚拟方法:

    class ClassOne
    {
    public:
        void methodOne() {
            if (you need to use methods of ClassTwo) 
                 methodTwo();
        }
        virtual void methodTwo() = 0;
    };
    
    class ClassTwo : public ClassOne
    {
    public:
        void methodTwo() override {
            if (you need to use methods of ClassOne) 
                 methodOne();
        }
    };
    

        2
  •  0
  •   eerorika    6 年前

    如何使类相互继承?

    这样的继承也是自相矛盾的,因为类对象本身包含作为子对象的基。同样地,你们会在这样的情况下结束,有一个在里面,两个在里面,两个在里面,一个在里面,两个在里面,一个在里面,两个在里面,一个在里面,两个在里面。。。你能看到这是怎么回事吗?它哪儿也去不了。对象是无限大的,因为它包含无限深的继承层次结构。


    这样做的目的是我希望“ClassTow”的成员函数在“ClassOne”中可用,但“ClassTwo”也需要“ClassOne”中的成员变量。

    您可以有两个类,它们都可以访问所有数据成员和如下函数:

    struct ClassOne {
        // all the member functions
        // all the data members
    };
    
    struct ClassTwo : ClassOne {
        // nothing here
    };
    

    现在有两个类,它们都可以访问相同的数据成员和成员函数。

    推荐文章