0

編集: 大きな謝罪 - gUniverse の後に gTime を宣言しましたが、より多くのコードを提供するように求められた後、間違ってここに投稿しました。私はそれを私のプログラムの以前のバージョンと混同しましたが、実際には反対でした.

クラスgTimeの別のオブジェクトのインスタンスへのポインターの宣言を含むクラスgUniverseがあります。

class gUniverse;
class gTime;

class gUniverse
    {
    public:
    gUniverse():UniverseTime(new gTime(1) ){}
    ~gUniverse();

    gTime* UniverseTime;
    };

class gTime
    {
  public:
    gTime();
    gTime(int start);
    void StartTimer();
    double ElapsedTime();

  private:
    clock_t StartTime;
    clock_t StopTime;
};

これは「不完全型」でコンパイルされません。

ただし、外部宣言を行うと、次のようになります。

class gUniverse
    {
    public:
    gUniverse();
    ~gUniverse();

    gTime* UniverseTime;
    };

gUniverse::gUniverse():UniverseTime(new gTime(1) )
   {
   }

それから、これはすべてクールです。すべてのデストラクタとコピー コンストラクタを処理することを考えると、何が問題なのか、2 番目のケースが問題ないかどうかを理解したいと思います。

4

1 に答える 1

1

これは重要な表現です:

new gTime(1)

gTimeこのコード行は、コンパイラがクラスへのインターフェイスを認識していない限りコンパイルできません。たとえば、単一の引数としてint取ることができるコンストラクターまたは他のコンストラクターを受け入れることができるコンストラクターがあるかどうかを確認する必要があります。1

解決策の 1 つは、クラス全体gTimeをファイルの先頭 (クラスの上) に近づけることgUniverseです。

new ...または、これをファイルの後半に移動することもできますgTime。これを行うには、その定義をクラスの外に移動して、次のようにします。

gUniverse::gUniverse():UniverseTime(new gTime(1) )    {   }

gTimeただし、これはクラスの後に配置した場合にのみ機能します。これを単純にクラスの後、gUniverseクラスの前に配置した場合gTime、これは機能しません。したがって、これは実際にはインラインと外部の関係ではありません。重要なことは、このコンストラクターの定義はクラスgUniverseの後にある必要があるということです。gTime

于 2013-10-11T17:33:08.513 に答える