我计划让两个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==dead
或myobject.m_status==alive
,dead
和alive
可能的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
};
答案 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);
}