2016-11-27 92 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或在列表中複製其所有值
這裏我只是簡化它與富,但在現實生活中的對象是更復雜
我不用什麼參考指針(* &)

+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是

0x1000 

指向爲0x2000 和TSK指針在

0x1010 also pointing to 0x2000 

現在T1指針的指針是在

0x3000 

和pointong at讓我們說

0x4000 

現在你已經做了TSK = T1

意味着TSK將指向0x4000的

記住,T2仍位於0x1000 ANS指向爲0x2000

其中一個解決方案將是 返回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 ToPointer(Test * tst)發生了什麼是ToPointer()正在製作該指針的本地副本。然後,您將tst分配給t1,但所做的只是分配該本地副本。主力隊員仍然坐在那裏不動。當函數返回時,ToPointer中的本地副本將會死亡。你可以做很多事情,比如將指針作爲指針指向Test **,或者引用指針Test * &,或者像user64322所說的那樣,返回一個指針,或者返回一個對指向的引用的引用指針,選擇是無限的。