0

私はプロジェクトのコードを調べていて、ステートメントに遭遇しました

 class foo;
.
.
.
.
 foo* f1;

さまざまな場所で。クラスは、含まれているヘッダーのいずれにも宣言されていません。それが何を意味するのか誰か教えてください。

4

3 に答える 3

4

前方宣言です。クラス、構造体、および関数に使用でき、これが別の場所または後で定義されていることをコンパイラに伝えます。

クラスには、(少なくとも) 2 つの使用例があります。

1.完全な定義は必要ありません

前方宣言の後、コンパイラはクラスのサイズやメンバーを認識せず、名前のみを認識します。これは、クラスへのポインター (および基本的にポインターの周りの構文糖衣である参照) には十分です。ただし、多くの場合、ポインターで十分であり、ヘッダー ファイル全体を別のファイルに含めることを避けることができます。これにより、1 つのヘッダーが変更されたときにすべてを再コンパイルする必要がなくなり、コンパイル速度が向上します。

myfuncs.h

class MyClass; // forward declaration
void helpMyClass(MyClass &needy);

// here this would give compiler error about incomplete type:
//void badHelp(MyClass needy); // value needs definition

myfuncs.cpp:

#include "myclass.h" // entire MyClass definition
void helpMyClass(MyClass &needy) {
  needy.helpMe(false); // needs full definition
}

これの重要な使用例は、いわゆるPIMPL idiomであり、ここ SO のタグの下でも十分にカバーされています。

2. 2 つのクラスが互いに参照する必要がある

class node; // forward declarion

class collection {
    node *frist; // pointer enabled by forward declaration
}

class node {
    collection *owner; // already defined above so works too
}

この場合、これをうまく機能させるには前方宣言が必要です。実際に見た場合に備えて言っておくと、void ポインターとキャストを使用する醜い方法があり、初心者のプログラマーがこれを行う方法がわからない場合に使用されることがあります。

于 2013-10-25T05:18:40.483 に答える
3

前方宣言について言及していると思います。fooという名前のクラスが後で定義されることをコンパイラに伝えます。それまでは「不完全型」であり、クラスへのポインタと参照を定義できます。クラスのインスタンスは、完全に定義されるまで作成できません。

于 2013-10-25T05:00:45.233 に答える
0

あなたの宣言は間違っていますか?わかりません..「任意の」スペース「名前」を使用できないことは知っています..おそらくアンダースコアを逃しましたか?

私はあなたが意味したと信じています:

class foo any_name();

その場合、foo のクラス インスタンスを返す any_name という関数を前方宣言しています。

例:

#include <iostream>

class foo any_name();  //The forward declaration..

class foo   //the foo class implementation.
{
    public:
        foo(){std::cout<<"hey";}
};

class foo any_name() //The implementation of the function..
{
    std::cout<<"any_name";
    //return {};   //Can be used to return a constructed instance of foo.
};

 int main()
 {
     any_name();
 }
于 2013-10-25T05:05:12.323 に答える