【问题标题】:Setting a private data member设置私有数据成员
【发布时间】:2014-04-20 15:51:46
【问题描述】:

我有一个私有布尔数据成员(值),它是 Bar 类的一部分,我正在尝试使用另一个类 Foo 的指针来访问它。但是,当我尝试使用指针访问数据时,就像我之前设置的数据已重置返回错误值一样。 这是我正在谈论的示例,Bar 类的头文件:

class Foo;

class Bar {
private:
  bool value;

public:
  void read();
  bool isValue();
};

这是源文件的示例。

 void Bar::read() { //setter method that sets value to true.
    value = true;
}

bool Bar::isValue() { //at this point if I called this it would 
    return value;     //return true as expected.
}

Foo 类的标题:

class Bar;

class Foo {
private:
  Bar* barPtr; //a pointer to class Bar.

public:
  void readValue(); 
};

和源文件:

void Foo::readValue() {
   cout << barPtr->isValue(); //pointer that accesses and displays value. 
}

这最后一步是我遇到问题的地方。返回的值为0,false,我不明白为什么。当我在 main 中调用 cout isValue() 时,它返回正确的值 true。我唯一能想到的可能是我需要一个复制构造函数?如果是这种情况,我不完全确定如何针对这种情况实施。

谢谢!

【问题讨论】:

  • 你没有在任何地方设置value,所以它的值是不确定的。
  • 你了解隐私的概念吗?

标签: c++ class pointers boolean


【解决方案1】:

发生的情况是您没有在 Bar 的构造函数中初始化 value 的值。因此,它开始时的值基本上是在构建它的堆栈上随机出现的任何值——该值是不确定的,并且可以从运行到运行变化。

通过在 Bar 构造函数中初始化 value 来解决此问题,例如定义如下构造函数:

Bar::Bar()
    : value(false) {}

在你的类声明中相应地声明它,你应该被设置。

【讨论】:

    【解决方案2】:

    您没有初始化指向Bar 对象的指针,也没有初始化它的值。您需要通过有效对象初始化指针,然后设置其值以使其为真。另外,如果需要,在Bar的构造函数中初始化默认值。

    【讨论】: