3

次の C++ フラグメントを検討してください。

foo.h:

class foo
{
bar myobj;
};

bar.h:

class bar
{
foo *yourobj;
};

他のファイル:

#include "foo.h" //because foo.h is included first bar will not be defined in foo.h
#include "bar.h"

foo container;

bar blah;

わざわざコンストラクターなどを書く必要がなかったことはわかっていますが、おわかりいただけたでしょうか。この状況を改善する方法を知っている人はいますか?

4

2 に答える 2

7

これを行うには、いくつかの一般的な手法があります。

まず、可能な場合は前方宣言を使用します。次に、循環依存の一部がクラス内の関数に依存している場合は、そのクラスがそれらの関数の宣言を提供する「インターフェイス」クラスから継承されるようにします。最後に、PIMPL (実装の詳細へのポインター) を使用します。クラス宣言にすべてのフィールドをリストする代わりに、実際のクラス データへのポインターを含めるだけです。

たとえば、foo.h

class foo_members;

class foo
{
    foo_members* opaque;
};

そして、foo.cpp

#include "bar.h"
class foo_members{
    bar mybar;
};
于 2012-09-06T01:31:08.490 に答える
1

もう 1 つの方法は、すべてのクラスを宣言するヘッダーを 1 つだけ作成することです。

[classes.h]

class foo;
class bar;

class foo
{
    bar *FoosBar;
    int FooFunc(void);
};

class bar
{
    foo *BarsFoo;
    bool BarFunc(void);
}

[foo.cpp]

#include "classes.h"

int foo::FooFunc(void)
{
    // Reference FoosBar somewhere here or something maybe
    return 7;
}

[bar.cpp]

#include "classes.h"

bool bar::BarFunc(void)
{
    // Reference BarsFoo somewhere here or something maybe
    return true;
}
于 2012-09-06T01:44:39.000 に答える