1

私はC++でコーディングしており、クラスのヘッダーファイルにプライベートデータメンバーがあります。

private:
      Object1 obj1;
      Object2 obj2(&obj1);

したがって、2番目のオブジェクトは最初のオブジェクトへのポインタを取ります。プログラムをコンパイルしようとすると、次のエラーが発生します。

「'&'の前に予期される識別子 トークン"

定義ではなく、実装ファイルのこのクラスのコンストラクター内のオブジェクトをインスタンス化する方法はありますか?このエラーを修正するにはどうすればよいですか?プログラムはコンパイルされません。

4

4 に答える 4

2

C ++では、クラス定義の一部としてメンバーを初期化することはできません。この種の操作は、コンストラクターで実行する必要があります。

myClass() : obj2( & (this->obj1) ) { ... }

obj2これは通常警告を生成しますが、の構築が完了するまでコンストラクター引数を使用しない限り問題ありませんmyClass

于 2010-12-11T22:11:58.437 に答える
1

コンパイラがこのエラーで通知しているのは、参照をパラメータとして受け取っているをobj2返す、というメソッドを作成しようとしているということです。Object2しかし、参照のタイプが何であるかを理解することはできません。

一方、オブジェクトを作成する前に参照を設定する場合は、次のように記述できます。

Object2* obj2 = &obj1;

編集

このエラーを修正するにはどうすればよいですか?プログラムはコンパイルされません。

プログラムをコンパイルすることが常に最良の解決策であるとは限りません。おそらく、プログラムがコンパイルされない理由があり、その理由を理解する必要があります。エラーを修正するだけでは、原因が解決しない場合があります。ナワズがコメントで指摘したように、タイプObject1Object2が異なる場合、あなたがやろうとしていることは正しいことではない可能性があります。

于 2010-12-11T22:11:16.003 に答える
1

このように書くことはできません:

 Object2 obj2(&obj1);

次のように、コンストラクタを使用してオブジェクトを初期化します。

class Sample
{
private:
      Object1 obj1;
      Object2 obj2;
public:
     Sample(Object1 o1)  : obj1(o1), obj2(&o1)
     { 
     }
};

これを詳しく理解するには、これを読んでください。

http://www.cprogramming.com/tutorial/initialization-lists-c++.html

于 2010-12-11T22:09:48.297 に答える
0

宣言でそのようなメンバーに値を割り当てることはできません。これは、クラスのコンストラクターで行う必要があります。

MyClass
{
    private:
        Object1 obj1;
        Object2 obj2;

    public:
        MyClass()
        {
            obj2 = Object2(&obj1);
        }
};
于 2010-12-11T22:12:19.157 に答える