2013-07-03 47 views
2

我正在創建一個屬性類,它將唯一鍵和任意值存儲爲字符串(以及寫入配置文件時使用的可選註釋字符串)。目前我正在使用創建基本屬性類的方法來保存原始字符串,然後將其分類爲特定於類型的屬性 - 例如。一個IntProperty,它實現了一個將字符串轉換爲int的getValue()函數 - 以避免每次我想讀取它時都必須從字符串手動轉換屬性值。這些子類使用getPropertyType(),這是一個在基礎中定義並在每個派生中重寫的虛函數,用於返回枚舉值以標識它們所持有的哪種類型的屬性,並且基類返回「none」標識符。因爲我使用的是Qt,並且它所需的接口宏不支持模板對象,所以如果值得使用模板,我可能會忽略使用接口的想法。)具有不同返回類型的C++多態函數

(http://support.microsoft.com/kb/

我的目的是通過從基本屬性類中繼承它們並允許基本屬性指針的數組來允許多種不同類型的屬性(字符串,整型,浮點...)的列表。然而,我遇到了這樣的問題:從派生類中的某個特定類型提取屬性會變得非常尷尬,因爲指向基類的指針顯然不知道派生類中新定義的getValue函數。我剩下的選項是從基類中提取字符串並手動轉換,或者將基類指針轉換爲正確的派生類指針。第一個選項通過要求我手動進行轉換來使子類化變得無用,而第二個選項使得子類化成爲無用的,而第二個選項使得代碼變得無用,因爲每次我想知道哪個指針指向哪個指針時,會在屬性標識符值中包含一個大的switch語句投到。

怎樣才能解決這個問題?我想盡可能簡單地保留屬性值的檢索 - 即。儘可能少的樣板代碼,我可以從一個數組中獲取基類指針,以保持屬性值的正確類型的副本。是否值得考慮相反的問題 - 有多個強類型的屬性類,它們都支持使用字符串獲取和設置它們各自的值?

回答

2

這是怎麼回事? (未經測試,但你應該明白)

class BaseType { 
public: 
    virtual void getValue(string &s) { s = "";       }; 
    virtual void getValue(int &i) { i = 0;        }; 
    virtual void getValue(double &d) { d = 0.0;       }; 
}; 

class IntType : public BaseType { 
public: 
    virtual void getValue(string &s) { s = to_string(myvalue);   }; 
    virtual void getValue(int &i) { i = myvalue;      }; 
    virtual void getValue(double &d) { d = static_cast<double>(myvalue); }; 
private: 
    int myvalue; 
}; 

class DblType : public BaseType { 
public: 
    virtual void getValue(string &s) { s = to_string(myvalue);   }; 
    virtual void getValue(int &i) { i = static_cast<int>myvalue;  }; 
    virtual void getValue(double &d) { d = myvalue;      }; 
private: 
    double myvalue; 
}; 

class StrType : public BaseType { 
public: 
    virtual void getValue(string &s) { s = myvalue;      }; 
    virtual void getValue(int &i) { i = stoi(myvalue);     }; 
    virtual void getValue(double &d) { d = stod(myvalue);     }; 
private: 
    string myvalue; 
}; 
+0

這是一個很好的方法。最終,我選擇使用visitor方法,將訪問者對象傳遞給基類指針將返回數據作爲訪問者中包含的正確類型。 – x6herbius

0

當然,由於接收方需要知道它得到的是什麼類型,使用一個表示你回來的名字,例如,

int GetInt(const string& key); 
string GetString(const string& key); 
double GetDouble(const string& key); 

等會同樣調用它Get(const string& key)一樣好 - 而且由於C++語言並不只允許您在返回類型區分,那是行不通的。

另一種方法當然是有

template <typename T> 
void Get(const string& key, T& value); 

(可能需要實際執行各種不同的變型的不同,所以它可能不會真正幫助很多使用模板,但它讓我更容易寫在答案作爲模板!))

相關問題