2011-12-12 60 views
2

我有一個類學生與一個整數變量C++如何額外信息添加到現場

class Student { 
int id;... 
}; 

有時候ID是指學生的ID,有時它指的是自動生成的 ID,它是完全無關的學生的ID(也許學生根本沒有ID ,或者被忽略)。問題在於,處理學生算法時,必須根據學生是否帶有id或是否自動生成來改變其行爲 。

我想添加一個額外的字段(布爾)來指定哪個是哪個。但是這個 會導致兩個字段不同步的危險。

或者有 enum而不是bool。但我覺得必須有更好的方式來以更面向對象的方式指定這個 。

+0

如何有兩種向量的某種,一種是自動生成的id,另一種是真正的id。然後有一個int來保持它們的同步(加上id的總和)。只是頭腦風暴,我不知道你的程序的目的。 – Griffin

+0

使用不同的名稱調用其他信息。 – Pubby

回答

2

我想增加一個額外的字段(布爾)來指定哪個是 哪個。但是這會導致兩個區域不同步的危險。

這就是數據隱藏的意義。如果您將這兩個字段設爲不公開,您可以通過公共成員功能控制其保持同步。

class Student { 
public: 
    Student() 
     :id_(rand()), 
     autogen_(true) 
    {} 

    Student(int id) 
     :id_(id), 
     autogen_(false) 
    {} 

    void SetID(int id) 
    { 
     id_ = id; 
     autogen_ = false; 
    } 

    int GetID() const { return id_; } 
private: 
    int id_; 
    bool autogen_; 
}; 
+0

我也認爲信息隱藏可能是這裏的關鍵概念,但是您並沒有解決數據的設置和訪問問題。信息隱藏的目的不是讓類的用戶能夠自己設置自動生成的字段,而是在設置id時實現它,消除了不同步數據問題。同樣非常重要的是,正確的做法會增加代碼的可讀性,從而消除評論的需求。 –

+0

@EmileVrijdags:請參閱默認構造函數。我不知道他的具體規格是什麼,我也不需要。我給了他需要解決他的問題的重要信息,他可以想出如何將其應用於他的具體情況。 –

1

如果自動生成的數字僅爲正,則可以在指定學生證加負號。這可以讓您區分自動生成的和您分配的ID。而當使用ID時,你可以獲得絕對的價值。

0

聽起來好像您可以使用「基礎學生」類來定義處理算法處理學生對象的界面,然後爲每種類型的ID(學生ID或自動生成的)分別派生類,其中每個都具有在派生類中定義的適當的處理處理邏輯。這是一個更加面向對象的設計。

1

我爲enum投票 - 它使代碼比bool更具可讀性,並且它可能會佔用與bool一樣多的內存,如果您有第三種ID的需求,則可以擴展它。

1

我不太瞭解OOP理論,但是你可以編碼信息的類型。

// tagged_id<T1> and tagged_id<T2> are distinct types that convert to int 
template <typename Tag> 
struct tagged_id { 
    int id; 
    explicit tagged_id(int id) : id(id) {} 
    operator int() const { return id; } 
}; 

struct student { 
    struct autogenerated_id; 
    struct real_student_id; 
    // variant is a tagged union of types — it'll either be one or the other 
    boost::variant<tagged_id<autogenerated_id>, tagged_id<real_student_id>> id; 
}; 

你可以閱讀如何在儲值行動Boost.Variant文檔。