0

編集: ガード付きの変更されたヘッダー ファイル。この例ではそれらを入れるのを忘れています。私はすでにプロジェクトにそれらを持っていましたが。

私はこの2つのクラスを持っています。

ファイルああ:

#ifdef A_H
#define A_H
#include "b.h"
#include "x.h" //not related to problem, is just included
class B; //fwd declaration, needed to use getB() outside of A
class A
{
public:
    A(X &x);
    B &getB();
    ...
private:
    X &x;
}
#endif

ファイル bh:

#ifdef B_H
#define B_H
#include "x.h"
class A; //fwd declaration
class B
{
public:
    B(X &x, A &a);
    void methodThatUsesA();
    ...
private:
    X &x;
    A &a;
}
#endif

ファイル a.cpp:

#include "a.h"
#include "b.h"
A::A(X &x):x(x){}
B& A::getB()
{
    static B b(x, *this);
    return b;
}
...

ファイル b.cpp:

#include "b.h"
#include "a.h"
B::B(X &x, A &a) : x(x), a(a){}
void B::methodThatRequiresA(){
    //does its thing...
}

それらの外から、私はそれらを次のように使用します:

#include "x.h"
#include "a.h"
X x(...);
A a(x);
a.getB().methodThatRequiresA();

これを再開すると、クラス A のオブジェクトが機能することを必要とするクラス B があり、A は getB() を介してそれ自体を使用するタイプ B のオブジェクトを提供します。これは大丈夫でした。これを行ってからコンパイル時間は数秒増加しましたが、プロジェクトにはもう1つのクラスしかありません。

循環依存関係はコンパイルに時間がかかりますか? もしそうなら、このような多くの循環依存関係を持つプロジェクトをコンパイルするには、多くの時間がかかる可能性があります.

4

1 に答える 1

1

特に最適化を使用した大きなプロジェクトのコンパイルには、かなり時間がかかる場合があります。しかし、あなたの場合の原因は、ヘッダーにガードを使用しておらず、コンパイラーが同じヘッダーファイルを複数回解析する必要があることです。したがって、解決策は次のようになります(ファイルahの場合):

#ifndef A_H_
#define A_H_
// 
//

#endif // A_H_

これには、MS VSなどからのプラグマのようなさまざまなソリューションがありますが、これはIMOの最もポータブルな方法です。シンボルはこれとまったく同じである必要はありませんが、一意である必要があります。

于 2013-02-23T16:45:36.970 に答える