2017-03-04 4 views
2

Iは、ポインタによってデータメンバにアクセスしようとしたので、私はこのコードを書く:ポインタでプライベートデータメンバーを変更することはできませんか?

#include <iostream> 
#include <string> 

using namespace std; 

class test{ 
public: 
    int * returnAdd(); 
    int getA(); 
    void setmember(int x); 
private: 
    int a; 
}; 

int *test::returnAdd() 
{ 
    return &a; 
} 

int test::getA() 
{ 
    return a; 
} 

void test::setmember(int x) 
    { 
     a = x; 

     return; 
    } 

int main(void) 
{ 
    test test1; 

    int *a = test1.returnAdd(); 
    test1.setmember(12); 
    *a++; 
    cout << test1.getA() << endl; 
    cout << *a << endl; 

    return 0; 
} 

Iは、データメンバの値は、(a)は13になるだろうが、それが起こらないことを期待します。私は* aの価値を印刷しました。私はゴミでした。 データメンバの値が変更されない理由は?なぜ* aにはガベージが含まれていて、データメンバaの値のコピーさえありません。

+0

に役立つ簡単な方法 希望を探していることを行いメンバ関数を記述するようにしてください取得したいので、それがプライベートで読む](http://stackoverflow.com/a/18484907/7571258)。彼は式 '* a ++'(変数 '* ++ a'と' ++ * a')が実際に何をするかをかなり良いと説明しています。 – zett42

答えて

2

*a++;意味するものではありません:

  1. 逆参照a
  2. インクリメントそれ(aによって指し示されているもの)

*a++;手段:

  1. 逆参照a
  2. 増分で指摘されているものインクリメントするポインタa

使用(*a)++;

0

ポインタを移動してから読み込みます。試行(*a)++;

4

の結果、aが参照解除される前に、ポストインクリメント演算子++が実行されます。元の式aは、post increment operatorによって戻されます。

一方、aは、次の存在しない隣接メモリを指すようにインクリメントされます。次にaを参照解除すると、未定義の動作が呼び出されます。

はおそらく望んでいた:

(*a)++; 

Demo

+0

_Henceを使用して、存在しない隣接する次のメモリに移動し、逆参照しました。 Undefined Behavior._ ...が呼び出されましたが正しくありません。 '* a ++'の効果は、ポインタ 'a'が最初に逆参照されてからインクリメントされることです。この[例](http://coliru.stacked-crooked.com/a/fd98eb9e73f3da42)は、 "1"、次に "2"を表示します。あなたのステートメントが正しい場合は、 "2"を印刷し、次に "2"を印刷します。良い説明については、[この回答](http://stackoverflow.com/a/18484907/7571258)を参照してください。 – zett42

+0

@ zett42。それを指摘していただきありがとうございます。 Corrected – WhiZTiM

-2

あなたはそれが

あなたのため

void test::add_one(void) 
{ 
++a; 
} 

は、必ず[推奨これは

+0

これはOPの質問には答えません。 –

関連する問題