嘿伙计们,我在设置头文件方面遇到了麻烦。为了简化我的问题,这是一个例子:
#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
在编译器甚至知道它之前,我基本上需要在另一个类中使用一个类。在我定义内部之前,有没有办法告诉编译器我的类?
答案 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);
};
当声明了类型但未定义类型时,它被称为不完整。您可以使用不完整的类型执行各种操作,包括声明指针和对它的引用,以及将它用作函数声明中的参数或返回类型。您无法创建该类型的对象(并且包括声明该类型的非静态类成员),因为这需要定义以便了解各种事实,例如其大小。