2012-04-15 12 views
1

私はすでにthisがポインタであることを知っていますが、私は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 

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

+0

あなたが「アドレス」と呼んでいるのは確かに_reference_です。 – Vlad

答えて

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); 

が正しいバージョンです。

+0

おそらく、最初の例で参照を格納する方が良いでしょう。これは、元のコードのセマンティクスによく一致します。 – Vlad

+0

ポインタでアドレスを指すことはできませんが、ポイントではありませんか? –

+0

@Vladあなたはスコープの問題があります。 –

1

アドレスと*タイプポインタは同じものです。 Adult*を取ると、初期化構文でない=それを初期化するためにあなたの子供のコンストラクタを変更します。あなたはそのポインタを持っていたら、必要に応じて

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

、あなたの子クラスのコードはmy_adult->Whatever()を呼び出すことができます。 Adultオブジェクトが常にChildオブジェクトよりも寿命が長い場合にのみ、このアプローチが安全であることを知る必要があります。たとえば、注文が削除された場合、すべての注文アイテムも削除されるため、注文に対する無効なポインタを使用して注文アイテムについて心配する必要はありません。それがあなたのシステムにどのようにあるのか分からなければ、ポインタ構文よりも大きな問題があります。ここ

1

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

+1

これ以上の問題があります。たとえば、 'child'は値ですが' new Child'はポインタを返します。また、 'Child'は' Adult * 'を取るコンストラクタを持っていません –

+0

実際にはコンパイルされますが、必ずしも動作するとは限りません。オブジェクトを渡すので、自動メモリに割り振られる可能性があるため、アドレスを取得することは安全ではありません。 'my_adult'は' hand'がスコープ外に出たときにぶら下がりポインタになります。 –

+0

@LuchianGrigoreもちろん、必ずしも機能するとは限りません。しかし、もし彼が銀の皿の上にすべてを手に入れれば、彼はどんなことを学ばなければなりませんか? – zvrba

0

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

関連する問題