2012-04-16 16 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

単に「動作しない」と言うしないでください。具体的に何が機能していないのかを説明します。 –

答えて

1

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

はい、あなたは正しいです!あなたのコードはコピーを作成し、それを修正してすぐに破棄します。

tp -> data = newData; 

->オペレータ:

あなたが代わりにポインタを通じて渡される構造を変更する必要があります。これは、.メンバーアクセスオペレータのポインタに相当します。これは

(*tp).data = newData; 

と同等ですが、それはよりよく見えます。あなたが唯一のローカル変数を変更している

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; 

コピーあなたのオブジェクト:あなたが何をしたいか
はこれです。したがって、変更は失われます。私はあなたがC++で、さらにダイビングの前に一般的には、ポインタや構造についてもう少し読むことをお勧め

tp->data = newData; 

: あなたは尖ったオブジェクトにアクセスする必要があります。

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

イエップ。あなたはローカルコピーを作成し、それを修正しました。代わりに、あなただけ使用する必要があります。

tp->data = newdata; 
0

:それは単にそこに非効率であるものの

あなたは、printDataで同じことを行うことができます。

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

setDataで、この代わりに

tp->data = newData; 
1

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; 
} 
関連する問題