在其他类c ++之前无法访问类

时间:2012-08-17 17:09:58

标签: c++ class function header

嘿伙计们,我在设置头文件方面遇到了麻烦。为了简化我的问题,这是一个例子:

#ifndef MYHEADER_H
#define MYHEADER_H    

class Parent
{
    Child mykid; //a kid of mine
    void dosomething(void);
};

class Child
{
        Parent * mydad; //pointer back to my dad
        void dosomething(void);
};    

#endif // MYHEADER_H

在编译器甚至知道它之前,我基本上需要在另一个类中使用一个类。在我定义内部之前,有没有办法告诉编译器我的类?

4 个答案:

答案 0 :(得分:5)

此:

class Parent;
class Child
{
        Parent * mydad; //pointer back to my dad
        void dosomething(void);
};    
class Parent
{
    Child mykid; //a kid of mine
    void dosomething(void);
};

建议:将它们放在单独的标头中,在Parent中转发声明Child.h,在#include "Child.h"放置Parent.h

Parent需要Child的完整定义才能正常工作,Child只需要声明。

我还建议你停止使用原始指针。

答案 1 :(得分:0)

不确定

class Parent;

class Child { Parent * dad; };
class Parent { Child kid; };

要定义班级,所有班级成员必须拥有完整类型class Parent;使Parent成为不完整类型。但是,对于任何类型T,无论是完整还是不完整,T * 总是一个完整的类型。

答案 2 :(得分:0)

class Parent;

class Child
{
        Parent * mydad; // it's enough to know class exists
        void dosomething(void);
};  

class Parent
{
    Child mykid; // We must know size of a class
    void dosomething(void);
};

答案 3 :(得分:0)

Parent包含Child个对象,因此其定义必须在Child的定义之后;这是需要完整定义的类型的使用之一。

Child仅包含指向Parent的指针,因此它只需要声明Parent类型。

所以你需要:

// Declaration
class Parent;

// Definitions
class Child
{
    Parent * mydad; // type can be incomplete
    void dosomething(void);
};
class Parent
{
    Child mykid; // type must be complete
    void dosomething(void);
};

当声明了类型但未定义类型时,它被称为不完整。您可以使用不完整的类型执行各种操作,包括声明指针和对它的引用,以及将它用作函数声明中的参数或返回类型。您无法创建该类型的对象(并且包括声明该类型的非静态类成员),因为这需要定义以便了解各种事实,例如其大小。