2012-04-16 83 views
3

我有什麼應該是一個簡單的問題。我有一個全局函數(setData),它接受一個指向我的測試結構的指針。當我嘗試更新數據成員時,它不起作用。C++使用結構指針更新數據成員

#include <iostream> 
using namespace std; 

struct test { 
    int data; 
}; 

void setData(test* tp, int newData) { 
    test t = *tp; // I think the problem is here. 
    t.data = newData; 
} 

void printData(test* tp) { 
    test testStruct = *tp; 
    cout << testStruct.data; 
} 

int main() 
{ 
    test ts; 
    ts.data = 22; 
    setData(&ts, 44); 
    printData(&ts); 
} 
+3

不要只說「不工作」。描述什麼,特別是不起作用。 – 2012-04-16 15:10:19

回答

1

test t = *tp; // I think the problem is here.

是的,你說得對!您的代碼正在複製,修改它,然後立即丟棄。

而應該修改通過指針傳遞的結構:

tp -> data = newData; 

注意->操作。它是.成員訪問運算符的等效指針。它相當於

(*tp).data = newData; 

但它看起來更好。

你可以在printData同樣的事情,雖然這僅僅是一個低效率有:

cout << tp -> data; 
0

setData()功能僅修改您struct的本地副本

你需要將它複製回:

void setData(test* tp, int newData) { 
    test t = *tp; 
    t.data = newData; 
    *tp = t; 
} 

或者直接修改全局:

void setData(test* tp, int newData) { 
    tp->data = newData; 
} 

後者的版本會更有效,直觀。

1

你在setData中所做的是創建一個新的結構,並在那裏改變了數據。
你想做的事是這樣的:做作前

void setData(test* tp, int newData) { 
    tp->data = newData; 
} 
1
test t = *tp; 

複製你的對象。因此,修改失去了。 您需要訪問尖銳的物體:

tp->data = newData; 

我建議你進一步用C潛水前瞭解更多關於指針和結構一般有點++。

1
test t = *tp; // I think the problem is here 

是的。您現在已經制作了本地副本並對其進行了修改。相反,你應該只使用:

tp->data = newdata; 
0

你只是修改局部變量。做到這一點,而不是

tp->data = newData; 
1

void setData(test* tp, int newData) { 
    test t = *tp; // I think the problem is here. 
    t.data = newData; 
} 

setData聲明本身就是一個test的副本。如果你想調整呼叫者的test,你必須做它通過指針或引用:

void setData(test* tp, int newData) { 
    t->data = newData; 
} 

void setData(test* tp, int newData) { 
    test &t = *tp; // I think the problem is here. 
    t.data = newData; 
}