【问题标题】:Can't access class before other class c++在其他类c ++之前无法访问类
【发布时间】:2012-08-17 17:09:58
【问题描述】:
大家好,我无法按照我需要的方式设置头文件。为了简化我的问题,这里有一个例子:
#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
我基本上需要在编译器知道之前在另一个类中使用一个类。有没有办法在我定义里面之前告诉编译器我的类?
【问题讨论】:
标签:
c++
class
function
header
【解决方案1】:
这个:
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);
};
建议:将它们移到单独的标头中,在 Child.h 中声明 Parent 和在 Parent.h 中声明 #include "Child.h"。
Parent 需要Child 的完整定义才能工作,Child 只需要声明。
我也建议你停止使用原始指针。
【解决方案2】:
当然:
class Parent;
class Child { Parent * dad; };
class Parent { Child kid; };
要定义一个类,所有类成员都必须有一个完整类型。 class Parent; 使 Parent 成为不完整类型。但是,对于任何类型T,无论是完整的还是不完整的,T *总是是一个完整的类型。
【解决方案3】:
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);
};
【解决方案4】:
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);
};
当一个类型已声明但未定义时,它被称为不完整。您可以对不完整类型做各种事情,包括声明指针和对其的引用,以及在函数声明中将其用作参数或返回类型。您不能创建该类型的对象(包括声明该类型的非静态类成员),因为这需要定义才能了解各种事实,例如其大小。