2

クラスを拡張するには、これを行う必要があることがわかりました。

class x : public extendsThis { // rest here
};

したがって、2 つの別個のファイルに 2 つのクラスを作成します。

- particle.h -
class particle : public program {
};

 - program.h -

 class program {
    particle* myParticle;
 };

しかし、プログラム クラスには、再びプログラム クラスを拡張するパーティクル オブジェクトが必要でした。

ただし、これには、粒子クラスに program.h を含める必要があり、プログラム クラスに粒子.h を含めて、それらを相互に知らせる必要があります。ただし、これにより、コンパイルできなくなる無限ループが作成されました。

これを回避する方法はありますか、それとも何か間違っていますか?

4

5 に答える 5

3

はい、これを回避できます。非常に単純なクラス宣言を行うことができます。

program.h で:

class particle;

class program
{
  particle *myParticle;
};

パーティクルへのポインターを使用する必要があることに注意してください。

于 2011-05-24T18:24:15.920 に答える
1

場合によっては、インクルード ファイルの 1 つで前方宣言を使用できます。

class a;

class b { a* ptr; };

また、設計を再考する必要があることを示している可能性もあります。通常、プログラムはそのコンポーネントについて「知っている」必要がありますが、その逆は必要ありません。プログラムのコンポーネントは、明確に定義された単純な関数を持つ小さなスタンドアロン クラスである必要があります。すべてのクラスを絡ませると、「離れた場所で不気味なアクション」(バグ) が発生します。;)

于 2011-05-24T18:28:54.627 に答える
0

デフォルトのプログラム コンストラクターからデフォルトのパーティクル コンストラクターを呼び出すことの危険性の意味を説明するために、この回答を投稿しています。

#include <iostream>

class particle;

class program {
    particle* myParticle;

public:
    program();
};

class particle : public program {
public:
    particle()
    {
        std::cout << "Particle constructor\n" << std::flush;
    }
};

program::program()
{
    std::cout << "Program constructor\n" << std::flush;
    myParticle = new particle();
}

int main()
{
    program *myProgram = new program();
    delete myProgram;
    return 0;
}

このプログラムをコンパイルして実行すると、particle::particle()常に最初に呼び出すため、「プログラムコンストラクター」が出力され続けprogram::program()、無限ループが発生します。行をコメントアウトすると、myParticle = new particle();この問題が修正されます。

于 2011-05-24T18:56:12.890 に答える
0

それは私だけかもしれませんが、あなたはこれを間違っているようです。なぜ粒子クラスをプログラム クラスで拡張したいのですか? 理論的には、次のようなものが得られます。

class particle {
    particle *myParticle;
};

クラスを拡張すると無限ループが発生する可能性があることに注意してください。つまり、これは単なる私の理解であり、ひどく間違っている可能性がありますが、考慮すべきことです. 私がここから離れているかどうか誰かが教えてくれます。

于 2011-05-24T18:34:58.293 に答える
-2

ヘッダー ファイルでインクルード ガードを使用します: http://en.wikipedia.org/wiki/Include_guard

于 2011-05-24T18:23:27.740 に答える