2

このスニペットのどこに問題があるかを知ることができます:

関数内のポインターをリセットしたいのですが、ポインターを返すだけで機能するようになりましたが、副作用(ポインター渡し)で作成できませんでした。

void function(Object * obj)[{
    obj = new Object();
    cout << obj << endl;
    //return obj;
}

main(){
    Object * obj = 0;
    function(obj);
    cout << obj << endl;
}

この場合、結果は次のようになります。

0x12345678
0

あるべきだったのに

0x12345678
0x12345678

ポインターのポインターまたは参照のポインターのいずれかを使用してみましたが、それでも関数を通過できませんでした。値を返すだけで、魅力のように機能しました。しかし、いくつかのパラメーターでこれを行う必要があり、コードはここに表示されているよりもはるかに複雑です。

4

3 に答える 3

3

関数宣言を次のように変更すると、機能するはずです。

void function(Object  * &obj)

元のコードでは、ポインターを値で渡していました。つまり、関数はポインターのコピーを作成し、関数内のポインターへの変更は反映されません。参照渡しの場合、実際には元のデータで作業していますが、これはポインターを使用して舞台裏で行われる可能性があります。

于 2013-05-29T16:27:21.747 に答える
0

このトピックをご覧になることをお勧めします。

ポインターからポインターへのポインターによってオブジェクトを返します (C の方法):

void function(Object ** obj) {
  *obj = new Object();
}


main(){
  Object * obj = 0;
  function(&obj);
...

ポインターへの参照によってオブジェクトを返します (C++ の方法):

void function(Object *& obj) {
  obj = new Object();
}

main(){
  Object * obj = 0;
  function(obj);
...
于 2013-05-29T16:29:04.137 に答える
0

あなたが電話するとき

void function(Object * obj){

つまり、「関数」のスタックは、obj という名前のポインターのローカル コピーを保持しています。関数が戻ると、このローカル コピーは破棄されます。Yoは、次の方法で目的を達成できます。

void function(Object* obj&){

実際には、参照によって呼び出し元の obj ポインターを渡します。これで、obj への変更は呼び出し元のスコープにも反映されます。

于 2013-05-29T16:36:14.687 に答える