2012-04-16 56 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; 
}