3

我有一个简单的问题。我有一个全局函数(setData),它带有一个指向我的测试结构的指针。当我尝试更新数据成员时,它不起作用。

#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);
}
4

7 回答 7

3

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

是的你是对的!您的代码正在复制、修改它,然后立即丢弃。

您应该改为修改通过指针传入的结构:

tp -> data = newData;

注意->操作员。它是.成员访问运算符的指针等价物。它相当于

(*tp).data = newData;

但它看起来更好。

您可以在 中做同样的事情printData,尽管这只是效率低下:

cout << tp -> data;
于 2012-04-16T15:10:47.940 回答
1

您所做的setData是创建一个新结构,并在那里更改了数据。
你想要做的是:

void setData(test* tp, int newData) {
    tp->data = newData;
}
于 2012-04-16T15:10:37.203 回答
1
test t = *tp;

在做作之前复制您的对象。因此,修改丢失。您需要访问指向的对象:

tp->data = newData;

我建议您在深入了解 C++ 之前阅读更多关于指针和结构的信息。

于 2012-04-16T15:10:37.763 回答
1
test t = *tp;    // I think the problem is here

是的。您现在已经制作了本地副本并对其进行了修改。相反,您应该只使用:

tp->data = newdata;
于 2012-04-16T15:10:47.037 回答
1

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

setData声明它自己的 a 副本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;
}
于 2012-04-16T15:12:06.437 回答
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;
}

后一个版本更有效和更直观。

于 2012-04-16T15:10:11.180 回答
0

您只是在修改局部变量。改为这样做

tp->data = newData;
于 2012-04-16T15:11:38.960 回答