1

typedef アプローチがビルドに与える影響に興味があります。

次の例を考えてみてください。

#include "SomeClass.h"

class Foo
{
    typedef SomeClass SomeOtherName;

    SomeOtherName* storedPointer;

    void setStoredPointer(SomeOtherName* s);
}

void Foo::setStoredPointer(SomeOtherName* s)
{
    storedPointer = s;
}

上記のような状況になると、これにより typedef がヘッダー ファイルに書き込まれるため、ヘッダー ファイルに #include する必要があります。前方宣言がないためにビルド時間が長くなる可能性があることを懸念しています。

この投稿のコメントに基づく:

C++ での typedef の前方宣言

クラスを前方宣言し、参照またはポインターを typedef してから、.cpp ファイル内に #include することができます。これにより、ビルド時間が短縮されます。これについての私の結論は正しいですか?

もしそうなら、私は次のような typedef になるでしょう:

typedef SomeClass* SomeOtherNamePtr;
typedef SomeClass& SomeOtherNameRef;
typedef const SomeClass* SomeOtherNameConstPtr;
typedef const SomeClass& SomeOtherNameConstRef;

これは私には非常にきれいなコードのようには見えません。これを推奨する記事/投稿 (必ずしも SO ではない) を読んだことがあると思います。

これは受け入れられると思いますか?より良い代替案は?


更新:Michael Burr の回答を使用して、ポインターと参照のみのケースを解決できました。ただし、関数で sizeof() を取得しようとしたときに問題が発生しました。たとえば、クラスに次の関数があるとします。

//Foo.h
class Foo
{
    typedef class SomeClass SomeOtherName;

    void doSomething(const SomeOtherName& subject)
}

//Foo.cpp
#include "Foo.h"
#include "SomeClass.h"
void Foo::doSomething(const SomeOtherName& subject)
{
    sizeof(subject); //generates error C2027: use of undefined type 'SomeClass';
    sizeof(SomeClass); //generates same error, even though using the sizeof()
                       //the class that has been #include in the .cpp.  Shouldn't
                       //the type be known by now?
}

あるいは、これは機能します。

//Foo.h
class SomeClass;
class Foo
{
    void doSomething(const SomeClass& subject)
}

//Foo.cpp
#include "Foo.h"
#include "SomeClass.h"
void Foo::doSomething(const SomeClass& subject)
{
    sizeof(subject);
    sizeof(SomeClass);
}

Microsoft Visual C++ 6.0 を使用しています。これはコンパイラのバグですか、それとも一般的に標準に反していますか?

エラーのある例では、sizeof(SomeClass) は、Foo で作成される新しい typedef 型ではなく、typedef である元のクラスであることに注意してください。typedef で前方宣言を行うと、typedef であるクラスで何かを行う能力が制限されることに驚いています。


フォローアップ: XCode コンパイラを使用してテストしたところ、私の sizeof の質問は Visual C++ 6.0 コンパイラの問題であると思います。XCodeコンパイラはおそらく正しいと思いますが、現時点では他に試すことはありません. したがって、これは参考になりましたが、私の状況では最良の回答が機能しないため、個人的には現在のタスクで運が悪いです.

4

2 に答える 2

2

だろう

typedef class SomeClass SomeOtherName;

あなたのためにトリックをしますか?

これにより、ポインターまたは参照のみを使用しているコンパイル ユニットは、ヘッダーtypedefを必要としません。#includeSomeClass

于 2009-09-14T02:58:29.913 に答える
0

これについての私の結論は正しいですか?

はい。あなたが参照した質問の答えの1つは、次のことができることを示唆しています:

//forward declaration instead of #include "SomeClass.h"
class SomeClass;
//now this works even without #include "SomeClass.h"
typedef SomeClass SomeOtherName;

これは私には非常にきれいなコードのようには見えません

あなたの typedefs が価値を追加しているとは思いません。代わりに、おそらく前方宣言してから、「 」を直接SomeClass使用します。const SomeClass&

于 2009-09-14T02:59:34.713 に答える