我有一个非常简单的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或前向声明,但似乎没有任何帮助。我想这不是一个非常复杂的问题,但它开始令人沮丧
任何想法?
提前谢谢!
答案 0 :(得分:4)
你正在尝试不可能的事。您可以通过将Parent:Parent
的实现移动到实现文件来修复错误,但您的代码仍然是灾难性的。
构建一个Parent需要构建一个OlderSon并构建一个OlderSon也需要构建一个Parent(因为OlderSon 是一个Parent)。你会有无限的递归。
你不能同时使用Parent的构造函数调用OlderSon的和反之亦然!
答案 1 :(得分:0)
为什么不将子指针定义为Parent * like;
class Parent
{
private :
Parent* _os;
.
.
.
}
由于孩子的基类是父母。
答案 2 :(得分:0)
Parent()构造函数使用OlderSon()的构造函数。 但它不知道OlderSon,因为你只是向前声明它。 (这意味着:我将使用一个名为OlderSon的类,但所有你(Parent.hxx)必须知道它的名字,因为在这个Header文件中我只使用指向它的指针。) 尝试在包含OlderSon.hxx
的cxx文件中实现Parent()构造函数修改强>
我监督了OlderSon继承自Parent ...这导致无限递归的事实,这可能不是你想要的。