C++ 保留两个具有相反值的bool类成员
我计划有两个bool类成员(C++ 保留两个具有相反值的bool类成员,c++,class,c++11,C++,Class,C++11,我计划有两个bool类成员(m_alive和m_dead),这样它们的值总是相反的。这可能看起来有些愚蠢(事实上,它可能只是愚蠢),但正如您在下面的代码中所看到的,但我真正想要的是有一种更清晰的方法根据情况检查对象状态,不必键入!m_活着或!m_死了。 所以,是的,我真的不需要两个成员,但我想不出一个更简单的方法来做到这一点 我想到的第一个想法是创建一个函数,如果另一个函数也发生了变化,它会改变其中一个函数的状态,但我很确定需要一种更简单、更简单、更快速的方法来保持每个函数的正确值 顺便说一句,
m_alive
和m_dead
),这样它们的值总是相反的。这可能看起来有些愚蠢(事实上,它可能只是愚蠢),但正如您在下面的代码中所看到的,但我真正想要的是有一种更清晰的方法根据情况检查对象状态,不必键入!m_活着
或!m_死了
。
所以,是的,我真的不需要两个成员,但我想不出一个更简单的方法来做到这一点
我想到的第一个想法是创建一个函数,如果另一个函数也发生了变化,它会改变其中一个函数的状态,但我很确定需要一种更简单、更简单、更快速的方法来保持每个函数的正确值
顺便说一句,用定义是不可能的,因为它们的数量和我计划创建的不同对象一样多,而且似乎不实用
#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:在重读我的问题时,我突然想到了枚举类型
它需要检查死枚举类型类成员的死枚举或活枚举状态的可能值
尽管语法稍微长一点,但这是一种更好的方法吗
最终编辑:
感谢所有评论和回答的人。以下是我最终采用的解决方案:
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
};
您试图保留相同信息的两份副本,这违反了最佳做法
如果您正在寻找清晰性(并且您没有找到If(m\u alive)
和If(!m\u alive)
足够清晰),那么将自定义getter添加到myclass
:
bool isAlive() const { return m_alive; }
bool isDead() const { return !m_alive; }
您可以通过使用setter更改变量来实现这一点:
// optional setters
void setDead() { setDead(true); }
void setAlive() { setDead(false); }
// main setter
void setDead(bool isDead) {
m_alive = !(m_dead = isDead);
}
他们是私人的。所以你的代码不会编译。您应该向类中添加查询,而不是添加冗余字段myobject.is_dead()
或myobject.is_alive()
都可以在单个bool
中实现。它是冗余的,实际上并不需要<代码>!myobject.m_dead
与myobject.m_alive
一样清晰。有两种方法:is_alive is_dead,并将其实现基于bool@macroland如果你有一个公共getter和一个公共setter,它基本上是一个公共变量。缓存失效、命名和逐个关闭错误。您对两个变量的选择会导致在两个点中有一个值的“缓存”(我是活着还是死了?)。不要给自己制造麻烦。我会让那些成员函数const
很高兴知道最佳实践的名称,这样就不会再犯了,谢谢!还有答案,这正是我想要的!
// optional setters
void setDead() { setDead(true); }
void setAlive() { setDead(false); }
// main setter
void setDead(bool isDead) {
m_alive = !(m_dead = isDead);
}