1

thisはすでにポインタであることを知っていますが、正確に何であるかを理解したいと思いthisます。それはアドレスですか、それとも*タイプのポインタですか?

これを変数に格納する場合、その変数をどのように定義する必要がありますか?

これを例として取り上げましょう

class Adult
{
private:
 Child child;

public:
 Adult(){
  child = new Child(this);
  //to have something to hold onto and get back to the upper level of the hierarchy.
 }
};


class Child
{
private:
 Adult* my_adult;

public:
 Child();
 Child(Adult &hand){
  my_adult = hand;
 }
}

さて、問題が発生したのは、次のコード行ですmy_adult = hand; 。プロジェクトをビルドしようとすると、これが出力されます。このプロジェクトの背後にさらに多くのコードがあると、恐ろしくショックを受けます。

sys/chin.cpp:19:14: error: cannot convert ‘Adult’ to ‘Adult*’ in assignment

では、メンバーへのアクセスではなくデータ型として扱われる場合、これはどのように機能しますか?

4

4 に答える 4

3

my_adultはポインタhandですが、純粋で単純ではありません。

次のいずれかが必要です。

class Child
{
private:
 Adult my_adult; //no pointer

public:
 Child();
 Child(Adult &hand){
  my_adult = hand;
 }
};

また

class Child
{
private:
 Adult* my_adult;

public:
 Child();
 Child(Adult* hand){ //pointer parameter
  my_adult = hand;
 }
};

あなたの最初の例も違法です:

child = new Child(this);

子はオブジェクトであり、ポインタではないため、コンパイルしないでください。

child = Child(this);

正しいバージョンになります。

于 2012-04-15T18:18:41.657 に答える
1

アドレスと*型ポインタは同じものです。子コンストラクターを変更して、を取得し、 :Adult*ではなく初期化構文で初期化します。=

Child(Adult* hand): my_adult(hand) { } 

そのポインタを取得すると、Childクラスのコードでmy_adult->Whatever()必要に応じて呼び出すことができます。このアプローチは、Adultオブジェクトが常にオブジェクトよりも長持ちする場合にのみ安全であることを知っておく必要がありChildます。たとえば、注文が削除されると、すべての注文アイテムも削除されるため、注文への無効なポインタを使用する注文アイテムについて心配する必要はありません。それがシステムの状態ではない場合は、ポインタ構文よりも大きな問題があります。

于 2012-04-15T18:19:34.730 に答える
1

ここでの問題は、それmy_adultポインタであるhandが、参照であるということです。my_adult=&handたとえば、動作します。

于 2012-04-15T18:19:49.533 に答える
0

オブジェクトをポインタに割り当てようとしています。うまくいかないだろう。また、子供は大人の前に定義する必要があります。それ以外の場合、AdultはChildをポインター(および前方宣言)として定義する必要があります。

于 2012-04-15T18:20:13.777 に答える