C++指针转换为布尔值

5

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

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

    bool* state;
}

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

bool testbool = false;

BoolHolder testbool_holder( &testbool );

如果我这样做,testbool_holder.state总是报告它是true,不管testbool本身是true还是false。

我做错了什么?我只想让这个类能够维护testbool的最新值,但我不知道如何实现。谢谢。


如果你真的需要那些语义,至少使用一个参考。 - chris
2
state将始终是非空指针,因此测试为true;您需要使用*state - Alan Stokes
如果您想要一种更标准的持有指针(任何类型)的方式,请查看 std::unique_ptr。例如,创建它可以这样做:std::unique_ptr<bool> testbool_holder{new bool{false}};,测试它可以这样做:if (*testbool_holder) - Some programmer dude
1
@JoachimPileborg 测试持有者并不拥有该布尔值。 - Neil Kirk
@SteveJessop,没错,从OP的描述中听起来好像不会改变。 - chris
显示剩余2条评论
2个回答

7

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

*(testbool_holder.state) 返回 state 指向的布尔值。

尝试使用更多的 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()) { .. }

如果您只想允许读取访问(可能会更改指针为const bool *),请删除第二个getter。如果您同时需要读取和写入,则需要两个getter。(这是因为无法在常量对象上使用读/写操作进行读取)。请注意保留HTML标记。

如果是我,我会使用引用而不是指针。同样的东西,但有所不同。 :) - Some programmer dude
@JoachimPileborg 我避免在类中使用引用成员。如果您想要复制该类或稍后更改状态,那该怎么办呢? - Neil Kirk

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接