【问题标题】:changing private data members via pointers is not possible?无法通过指针更改私有数据成员?
【发布时间】:2017-03-04 16:37:53
【问题描述】:

我试图通过指针访问一个数据成员,所以我写了这段代码:

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

我希望数据成员 (a) 的值会变为 13,但它不会发生。然后我打印了*a的值,我就是垃圾。 我想知道为什么数据成员的值没有改变,而 a 指向它的位置?为什么 *a 包含垃圾,甚至没有数据成员 a 的值的副本???

【问题讨论】:

  • Recommended read。他很好地解释了*a++(以及变体*++a++*a)的实际作用。

标签: c++ class pointers


【解决方案1】:

由于operator precedence,后自增运算符++a 被取消引用之前执行。因此,post increment operator 返回的原始表达式 a 被取消引用。

同时a 递增以指向下一个不存在的相邻内存。下次您取消引用 a 时将调用未定义行为。

你可能想要:

(*a)++;

Demo

【讨论】:

  • 因此您将 a 移动到下一个不存在的相邻内存,然后取消引用它。哪个调用了未定义的行为。 ...不正确。 *a++ 的作用是指针a 先解引用,然后递增。这个Example 打印“1”然后“2”。如果您的陈述是正确的,它将打印“2”,然后再次打印“2”。请参阅this answer 以获得很好的解释。
【解决方案2】:

*a++; 不代表:

  1. 取消引用a
  2. 增加它(a 指向的内容)

*a++; 表示:

  1. 取消引用a
  2. 增加指针a

使用(*a)++; 来增加指向的内容。

【讨论】:

    【解决方案3】:

    您正在移动一个指针,然后从中读取。试试(*a)++;

    【讨论】:

      【解决方案4】:

      它是私人的,所以你想得到它

      尝试编写一个成员函数来为你做这件事

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

      始终寻找简单的方法 希望这会有所帮助

      【讨论】:

      • 这不能回答 OP 的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 2010-12-14
      相关资源
      最近更新 更多