0

嘿伙计们,我无法按照我需要的方式设置头文件。为了简化我的问题,这里有一个例子:

#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

4 回答 4

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);
};

建议:将它们移动到单独的标题ParentChild.h#include "Child.h"Parent.h.

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

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

于 2012-08-17T17:12:43.647 回答
0

当然:

class Parent;

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

要定义一个类,所有类成员都必须有一个完整的类型class Parent;Parent一个不完整的类型。但是,对于任何类型T,无论是完整的还是不完整的,T *始终完整的类型。

于 2012-08-17T17:13:09.867 回答
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);
};
于 2012-08-17T17:13:33.817 回答
0

Parent包含一个Child对象,所以它的定义必须在Child;的定义之后 这是需要完整定义的类型的用途之一。

Child只包含一个指向 a 的指针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);
};

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

于 2012-08-17T17:24:31.937 回答