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

提案: それらを別々のヘッダーに移動し、前方宣言Parentを inChild.hおよび#include "Child.h"in にしParent.hます。

Parentが機能するには の完全な定義が必要でありChildChild宣言のみが必要です。

生ポインタの使用をやめることもお勧めします。

于 2012-08-17T17:12:43.647 に答える
0

ParentにはChildオブジェクトが含まれているため、その定義は の定義の後に来る必要がありChildます。これは、完全な定義を必要とする型の用途の 1 つです。

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

型が宣言されているが定義されていない場合、それはincompleteと呼ばれます。不完全な型でさまざまなことを行うことができます。たとえば、ポインターとそれへの参照を宣言したり、関数宣言でパラメーターまたは戻り値の型として使用したりできます。サイズなどのさまざまな事実を知るために定義が必要なため、その型のオブジェクトを作成することはできません (その型の非静的クラス メンバーの宣言も含まれます)。

于 2012-08-17T17:24:31.937 に答える
0

もちろん:

class Parent;

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

クラスを定義するには、すべてのクラス メンバーが完全な型を持っている必要があります。class Parent;不完全な型Parentになります。ただし、完全か不完全かを問わず、どのタイプのも常に完全なタイプです。TT *

于 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 に答える