【问题标题】:C++ pointer to boolean value指向布尔值的 C++ 指针
【发布时间】:2013-09-04 18:10:25
【问题描述】:

我在尝试实现一个包含指向布尔值的指针的类时遇到问题...

class BoolHolder {
    public:
    BoolHolder(bool* _state);

    bool* state;
}

BoolHolder::BoolHolder(bool* _state) {
    state = _state;
}

bool testbool = false;

BoolHolder testbool_holder( &testbool );

如果我这样做,testbool_holder.state 总是报告它是真的,不管 testbool 本身是真还是假

我做错了什么?我只是希望班级能够保持 testbool 的最新值,但我不知道如何实现这一点。谢谢

【问题讨论】:

  • 如果你真的想要这些语义,至少使用参考。
  • state 将始终是一个非空指针,因此测试为true;你需要*state
  • 如果您想要一种更标准的方式来保存(任何类型的)指针,请查看std::unique_ptr。要创建它,例如std::unique_ptr<bool> testbool_holder{new bool{false}}; 并对其进行测试,例如if (*testbool_holder)
  • @JoachimPileborg 测试持有者并不拥有该布尔值。
  • 还有,为什么要使用指针而不是引用?

标签: c++ pointers boolean


【解决方案1】:

testbool_holder.state 如果 state 不是空指针,则返回 true

*(testbool_holder.state)返回state指向的bool值

试试这个以获得更多的 C++ 解决方案

class BoolHolder
{
public:
    BoolHolder(bool* state) : state(state) {}
    bool GetState() const { return *state; } // read only
    bool& GetState() { return *state; } // read/write

private:
    bool* state;
}

bool testbool = false;
BoolHolder testbool_holder(&testbool);
if (testbool_holder.GetState()) { .. }

如果您只想允许读取访问,请删除第二个 getter(并且可能将指针更改为 const bool *)如果您想要两者,那么您需要两个 getter。 (这是因为读/写不能用于读取 const 对象)。

【讨论】:

  • 如果是我,我会使用引用而不是指针。相识又有差别。 :)
  • @JoachimPileborg 我避免在类中引用成员。如果以后要复制类或更改状态怎么办?
【解决方案2】:

没错。您拥有的不是布尔值,而是指向布尔值的指针。您必须取消引用指针才能获得布尔值本身。由于您有一个指针,它将包含一个整数地址。由于在 C 和 C++ 中所有非零整数都是真的,所以你会得到真的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2011-07-06
    • 2020-01-20
    相关资源
    最近更新 更多