1

我有一个非常简单的父子关系,其中OlderSon从父继承和家长有一个指针指向他OlderSon,如:C++。孩子从父母继承,并包括父属性

#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

你的儿子是父母吗?我想也许你应该有一个Person类的基类,并且Person实例和其他的Person类实例组合起来形成族。 – Dennis 2012-04-17 10:48:16

+0

嗨,现在你指出了儿子/父母的概念没有多大意义。不过,我试图将名称更改为“父/子”以更清楚地解释它。实际上,这些类是Factory方法的一部分。我想在游戏中创建新的CHARACTERS和新的ITEMS。我创建了一个'ObjectFactory'(作为Parent),它将过滤一个ITEM或CHARACTER想要创建的对象。还有两个子类'ItemFactory'和'CharacterFactory',它们将是'ObjectFactory'的属性。然后根据情况使用'ItemFactory'或'CharacterFactory'的'.createObject(...)'。 – lllllll 2012-04-17 11:17:02

+0

你不需要过滤任何东西。 ObjectFactory应该是抽象的,如果用户想创建一个项目,他们应该只使用ItemFactory。 – Dennis 2012-04-19 09:09:47

回答

0

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

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

由于子类的基类是父类。

+0

谢谢你的建议,虽然它似乎没有解决所有的错误。 – lllllll 2012-04-17 11:10:41

+0

如果将os更改为指向Parent的指针,则可以移除opaque指针“class OlderSon;”在parent.hxx中删除了一些错误。 – sardok 2012-04-17 11:29:02

+0

但是,如何使用OlderSon类中的方法?每当我想使用它时,我应该投下它?此外,这些属性(例如名称,年龄)将是“父”,而不是“旧”,否? – lllllll 2012-04-17 12:13:04

4

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

构建一个Parent需要构建一个OlderSon并构建一个OlderSon也需要构建一个Parent(因为OlderSon 是Parent)。你会有无限的递归。

您不能同时拥有父的构造函数调用OlderSon的反之亦然!

+0

你好,谢谢你的回复。我认为,因为Parent类中的OlderSon属性是私有的,所以它不会被OlderSon继承。我将它描绘为:
实例化Parent - >将实例化为OlderSon作为Parent的属性,但私有属性未被继承,因此它会停止递归。我错了? – lllllll 2012-04-17 10:55:55

+0

这些只是访问限制。他们不会使该成员不存在。派生类*是父类的一个实例,并具有其所有功能。 (想一想 - 那么这行代码是什么呢?如果你执行了任何访问这个变量的基类成员函数,会发生什么?) – 2012-04-17 10:58:19

+0

我认为这行只是基于继承的属性创建一个新的数据结构从父类。有道理,这只是一个访问限制的问题,因为你实际上可以将它转换为父类。然后我不知道该怎么做才能实现这个概念。 – lllllll 2012-04-17 11:02:13

0

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

编辑:

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

+0

我原则上希望能够直接在.hxx文件上实现它。 @DavidSchwartz指出,我认为你对无限递归是正确的。我在想如何重新设计这个。 – lllllll 2012-04-17 11:09:25