保持两个bool类成员具有相反的值

时间:2017-01-03 13:14:07

标签: c++ class c++11

我计划让两个bool班级成员(m_alive& m_dead),以便他们的价值观始终相反。这可能看起来很愚蠢(事实上,它可能只是愚蠢的),但正如您在下面的代码中所看到的,但我真正想要的是根据具体情况更清楚地检查对象状态,并且无需键入!m_alive!m_dead即可。 所以,是的,我真的不需要两个成员,但我不能想到一个更简单的方法。

我想到的第一个想法就是创建一个功能,如果另一个改变了,那么改变其中一个的状态,但我很确定需要更简单,更容易和更快捷的方式保持每个人的正确价值。

AFAIK,它不可能与define一起使用,因为我会计划创建不同的对象,并且看起来并不实用。

#define object1.m_death= !object1.m_alive;
#define object2.m_death= !object2.m_alive;
// ...

所以在这里你有两个成员的主要想法:

class myclass
{
    public:
    // (...)
    private:
        bool m_alive;
        bool m_death;   // Always !m_alive
};

int main()
{
    myclass myobject;
    // (...)
    if (myobject.m_dead)
    //...
    if (myobject.m_alive)   // clearer than !myobject.m_dead()
    // ...
}

欢迎任何关于如何保持更新的建议,以及实现我的想法的任何其他方式。提前谢谢!

爱德华

PD:在重新阅读我的问题时,我想到了枚举类型。

它会检查myobject.m_status==deadmyobject.m_status==alivedeadalive可能的dead_or_alive枚举类成员dead_or_alive m_status值。

尽管语法有点长,但这可能是我寻求的更好的方法吗?

最终修改

感谢所有评论和回答的人。这是我最终采用的解决方案:

enum Piece_status:bool{     dead= false,    alive= true};

class Piece
{
    public:
        bool isAlive() const    {return  m_status;}
        bool isDead()  const    {return !m_status;}
    protected:      
        Piece_status        m_status;   // dead=false, alive=true
};

3 个答案:

答案 0 :(得分:10)

class myclass
{
    public:
        bool isAlive() const { return m_alive; }
        bool isDead() const { return !m_alive; }
    private:
        bool m_alive;
};

int main()
{
    myclass myobject;
    // (...)
    if (myobject.isDead())
    //...
    if (myobject.isAlive())
    // ...
}

答案 1 :(得分:6)

您试图通过保留2份相同信息来违反"Single Source of Truth"最佳做法。

如果您正在寻找清晰度(并且您没有找到if(m_alive)if(!m_alive)足够清楚),请将自定义getter添加到myclass

bool isAlive() const { return m_alive; }
bool isDead() const { return !m_alive; }

答案 2 :(得分:1)

您可以使用setter更改变量来实现此目的:

// optional setters
void setDead() { setDead(true); }
void setAlive() { setDead(false); }

// main setter
void setDead(bool isDead) {
    m_alive = !(m_dead = isDead);
}