C++ Can';t在其他类别c和x2B之前访问类别+;

C++ Can';t在其他类别c和x2B之前访问类别+;,c++,class,function,header,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 dosomethin

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

#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
我基本上需要在编译器知道之前在另一个类中使用一个类。在我定义类的内部之前,有没有办法告诉编译器我的类?

这是:

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
中包含“Child.h”

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

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

这:

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
中包含“Child.h”

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

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

当然:

class Parent;

class Child { Parent * dad; };
class Parent { Child kid; };
要定义类,所有类成员都必须具有完整类型<代码>类父级使父项成为不完整的类型。但是,对于任何类型的
T
,无论是完整的还是不完整的,
T*
始终是完整的类型。

确定:

class Parent;

class Child { Parent * dad; };
class Parent { Child kid; };
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);
};

要定义类,所有类成员都必须具有完整类型<代码>类父级使父项成为不完整的类型。但是,对于任何类型的
T
,无论是完整的还是不完整的,
T*
始终是一个完整的类型。

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

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);
};
子项
仅包含指向父项的指针,因此它只需要父项类型的声明

因此,您需要:

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

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

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

子项
仅包含指向父项的指针,因此它只需要父项类型的声明

因此,您需要:

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

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

谢谢,这将有望满足我的需要,谢谢您的建议!感谢这将有望为我所需要的工作,并感谢的建议!