【问题标题】:C++ forward class declarationC++ 前向类声明
【发布时间】:2015-10-23 17:24:15
【问题描述】:

我有2个A类和B类,简单的:

class A {
public:
    void someMethod() {
        //////
        B* b = new B(); //Error
    }
};

class B:A{
    ////
};

如何在父类中使用子类对象?

【问题讨论】:

  • 从设计的角度来看这是个坏主意。你想解决什么问题?
  • 当父类直接处理子类的实例时,这通常是设计不佳的标志。
  • 一般来说没有必要。你应该只继承这样的。我的意思是,从 B 呼叫 A。如果反过来,你的计划就有问题。

标签: c++ class inheritance forward-declaration


【解决方案1】:

需要在类B完全定义后定义成员函数,如:

class A {
public:
    void someMethod();
};

class B: A {
    ////
};
void A::someMethod()
{
    //////
    B* b = new B(); //Error
}

int main()
{
    A a;
    a.someMethod();
}

如果你只使用前向声明,但成员函数的定义是在类B完全定义之前,它是行不通的,因为new B需要完全定义B

【讨论】:

    【解决方案2】:

    你可以使用

        B* b = new B();
    

    仅当类 B 的定义完全可见时。

    在定义B之后移动函数的实现。

    class A {
      public:
        // Declare only
        void someMethod();
    };
    
    class B : A {
        ////
    };
    
    void A::someMethod() {
        B* b = new B();
    }
    

    【讨论】:

    • 此解决方案运行良好,谢谢。我主要用java编写代码,前向声明等没有问题。
    猜你喜欢
    • 2021-12-25
    • 2023-03-16
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多