1

我有一个非常简单的 Child-Parent 关系,其中 OlderSon 从 Parent 继承,并且 Parent 有一个指向他的 OlderSon 的指针,例如:

#ifndef PARENT_HXX
#define PARENT_HXX

#include <iostream>
#include <string>    
//#include "OlderSon.hxx"

class OlderSon;

class Parent
{
private :
    OlderSon* _os;
public  :           
    int _age;
    std::string _name;

    Parent(){
        _name="parent name";
        _age=60;
        //OlderSon* _os=new OlderSon();
    }
};

#endif //PARENT_HXX 

和儿子:

#ifndef OLDERSON_HXX
#define OLDERSON_HXX

#include <iostream>
#include <string>
#include "Parent.hxx"


class OlderSon: public Parent 
{
public:
    OlderSon(){
        _age=25;
        _name="Olderson name";
    }


 };

#endif //OLDERSON_HXX

但是,每当我尝试取消注释初始化指针的行时,OlderSon* _os=new OlderSon();我都会收到一条错误消息:

Parent.hxx: In constructor ‘Parent::Parent()’:
Parent.hxx:25:31: error: invalid use of incomplete type ‘struct OlderSon’
Parent.hxx:8:7: error: forward declaration of ‘struct OlderSon’

我尝试了不同的方式,即同时包含 .hxx 或通过前向声明,但似乎没有任何帮助。我想这不是一个非常复杂的问题,但它开始令人沮丧。
有任何想法吗?
提前致谢!

4

3 回答 3

4

你正在尝试不可能的事情。您可以通过将实现移动到实现文件来修复错误Parent:Parent,但您的代码仍然是灾难性的。

构造 Parent 需要构造 OlderSon,构造 OlderSon 也需要构造 Parent(因为 OlderSonParent)。你会有无限递归。

您不能同时让 Parent 的构造函数调用 OlderSon 的构造函数反之亦然!

于 2012-04-17T10:25:44.357 回答
0

为什么不将子指针定义为 Parent * like;

class Parent
{
private :
    Parent* _os;
.
.
.
}

由于孩子的基类是父母。

于 2012-04-17T10:25:43.360 回答
0

Parent() 构造函数使用 OlderSon() 的构造函数。但它不知道 OlderSon,因为您只是前向声明了它。(这意味着:我将使用一个名为 OlderSon 的类,但您 (Parent.hxx) 只需要知道它的名称,因为在这个头文件中我只使用指向它的指针。)尝试实现包含 OlderSon.hxx 的 cxx 文件中的 Parent() 构造函数

编辑:

我监督了 OlderSon 从 Parent 继承的事实......这导致了无限递归,这可能不是你想要的。

于 2012-04-17T10:27:04.803 回答