3

これが私のコードの一部です:

class A
{
  public:
  void init(classB& pObject);
  classB& _pObject;
}

void classA::init(classB& pObject)
{
  _pObject = pObject;
}

class B
{
  public:
  void init();
}

void classB::init()
{
  classA* pClassA = new classA;
  pClassA->init(&this);
}

コンパイル後に2つの問題が発生しました:

  1. _pObject = pObject;:実行可能なオーバーロードなし'='

  2. pClassA->init(&this);:アドレス式は左辺値または関数指定子である必要があります

私はこれらの問題について混乱しています...どうすればそれを修正できますか?

4

2 に答える 2

2

1);ではなく、のタイプがある*thisので、このコンテキストで使用する必要があります。&thisClassB**ClassB&

2)コンストラクターで参照メンバー変数のみを初期化できます。

classA::classA(classB& b) : _pObject(b)
{
}

(ところでdelete、簡潔にするためにステートメントを省略したと思います)

于 2012-05-09T12:54:40.420 に答える
2

まず、質問にタイプミスがあります。私はそれを仮定し、同じクラスAclassA参照しBますclassB

1)参照とポインタのいくつかの違いの1つは、一度初期化された参照に異なる値を割り当てることができないことです。_pObjectしたがって、クラスのコンストラクタの初期化リストで初期化することはできますが、に割り当てることはできませんA

classA::classA(classB& object) : _pObject(object) // Correct
{
  // _pObject = object;        on the other hand, this would be incorrect
}

2)&thisはのアドレスですがthis、実際には。が指す値への参照が必要ですthis*this代わりに使用する必要があります。関数classA::initを現在のクラス設計で機能させる方法はないことはすでに見てきましたが。_pObjectオブジェクトが構築された後にの値を本当に変更したい場合は、のclassB*代わりにそれを作成する必要がありますclassB&

于 2012-05-09T13:30:26.230 に答える