2017-01-03 53 views
4

我計劃讓兩個bool類成員(m_alive & m_dead)使其值始終相反。這似乎是一些愚蠢的(事實上,它可能只是愚蠢的),但你可以在下面的代碼中看到,但是我真正尋找的是有一個更清晰的方式來檢查視情節對象狀態,它將不會輸入!m_alive!m_dead。 所以,是的,我並不真的需要這兩個成員,但我想不出一個更簡單的方法來做到這一點。保留兩個具有相反值的bool類成員

我腦海中想到的第一個想法是創建一個函數,如果另一個改變,它也會改變其中一個的狀態,但我確信需要一個更簡單,更簡單,更快捷的方法保持每個人的正確價值。由於我們計劃創建不同的對象並且看起來並不實際,因此我們不可能使用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() 
    // ... 
} 

的任何建議如何對keep'em更新是值得歡迎的,以及實現我的想法的任何其他方式。提前致謝!

愛德華

PD:在重新閱讀我的問題,枚舉類型剛剛來到我的腦海。

它將emply檢查myobject.m_status==deadmyobject.m_status==alive,作爲dead_or_alive枚舉類型類成員dead_or_alive m_statusdeadalive可能的值。

請問這是什麼,我正在尋找一個更好的途徑,儘管是一個長一點的語法?


最後編輯

感謝所有誰評論和回答。下面是我最後採取的解決辦法:

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 
}; 
+6

他們是私有的。所以你的代碼不會編譯。你應該添加一個查詢到你的類而不是添加冗餘字段。 'myobject.is_dead()'或'myobject.is_alive()'都可以用一個'bool'來實現。 – StoryTeller

+3

這是多餘的,並非真的需要。 '!myobject.m_dead'和myobject.m_alive一樣清晰。 –

+2

兩種方法:is_alive is_dead並將其實現基於您的布爾 –

回答

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()) 
    // ... 
} 
+4

我會使那些成員函數'const' –

+0

@PiotrSkotnicki你是對的 –

6

你試圖違反"Single Source of Truth"最佳實踐,通過保持同一信息的2份。

如果你正在尋找清晰(和你不覺得if(m_alive)if(!m_alive)不夠清晰),然後添加自定義的getter方法myclass:通過使用setter方法改變變量

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

很高興知道最佳實踐的名稱,以免再次違反它,謝謝!而且也是爲了答案,就是我喜歡的東西! – eduherminio

1

您可以實現此:

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

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