2016-11-27 3 views
-3

を変更しないときは、私が持っているものです。C++値のポインタ渡された関数に反対するために、内部関数ポインタをコピーすることは、私はそれがここに出て成功 とを指し示す場所にポインタを変更したい

class Test { 
public: 
    Test() {}; 
    ~Test(){}; 
    int foo; 
}; 
void ToPointer(Test *tst) 
{ 
    Test* t1 = new Test(); 
    t1->foo = 111222; 
    tst = t1; 
} 

Test *t2 = new Test(); 
t2->foo = 2; 
ToPointer(t2); 
int fff = t2->foo; 

FFFの結果はまだ2
である私は、そのすべての値t2がt1までまたはリストのコピーを指すようにしたい
ここで私はちょうどfooで、それを単純化するが、実際の生活の中でオブジェクトが、私はへの参照を使用するためにどのようないけないはるかに複雑
ですポインタ(* &)

+2

あなたが参照を使用するか、またはあなたがどちらか'* tst = t1'。あなたのC++の本の違いは何ですか? – LogicStuff

+2

また、あなたの質問に9k +の評判とmvceはありません。 SOの仕組みを知っておく必要があります。 – skypjack

答えて

1

ポインタが値によって渡され、そしてあなたは、基準へのポインタを使用したくないので、あなたはこのようにポインタへのポインタを使用することができますに:

#include <iostream> 

using namespace std; 

class Test { 
public: 
    Test() {}; 
    ~Test(){}; 
    int foo; 
}; 

// tst will be a pointer to the pointer (address) of the Test instance. 
void ToPointer(Test** tst) 
{ 
    Test* t1 = new Test(); 
    t1->foo = 111222; 
    *tst = t1; // you can use the pointer tst, 
       // even though it is a copy of the original argument, 
       // because it points to the pointer that points to the Test instance. 
} 

int main() 
{ 
    Test* t2 = new Test(); // t2 stores the address of the Test instance 
    t2->foo = 2; 
    ToPointer(&t2);   // send ToPointer() the address of t2, 
          // which is itself a pointer to the Test instance 
    int fff = t2->foo; 
    cout << fff << endl; // verify that fff is 111222 

    return (0); 
} 
1

あなたのコードでporblemはT2が

0x2000で を指し
0x1000 

でポインタで、TSKは

0x1010 also pointing to 0x2000 

でポインタである今、T1ポインタが

であると言う

してみましょうさ

0x3000 

とpointongで言うことができます

0x4000 

今あなたが行っているTSK = T1

はTSKが0x4000の

を指し、T2は解決策の一つはなります0x2000で

を指す0x1000を留守にとどまっている、覚えていることを意味します to return t1

Test *ToPointer() 
{ 
    Test* t1 = new Test(); 
    t1->foo = 111222; 
    return t1; 
} 
int main() 
{ 
    Test *t2 = new Test(); 
    t2->foo = 2; 
    t2 = ToPointer(); 
    int fff = t2->foo; 
    std::cout<<fff; 
} 
2

tを渡すと2 to ToPointer(Test * tst)ToPointer()はそのポインタのローカルコピーを作成しています。次に、t1をt1に代入しますが、それはローカルコピーを割り当てることだけです。メインの背中はまだそこに座っています。また、ToPointerのローカルコピーは、関数が返ってきたときに終了します。あなたが行うことができることはたくさんあります。たとえば、ポインタTest **へのポインタ、またはポインタTest * &への参照、またはポインタuser64322のようにポインタを返すか、ポインティングされた参照への参照を返しますポインタは、無制限です。

関連する問題