2012-12-13 54 views
0

如果我的命名不正確,請原諒/糾正我。我不知道const_cast的使用。一般來說,在我看來,如果你必須使用const_cast,那麼你的類/方法可能從根本上有缺陷unless you're using legacy functions that aren't const-correct。不過,我可能會偶然發現一個適用的情況。我有一對夫婦,在施工過程中分配了一個大班,並且在對象的使用年限中保持不變。因爲這些對象被破壞和構造頻繁,我想試驗我相信被稱爲工廠模型:而不是創建/銷燬對象,我想檢索/返回到未分配的對象緩存。例如(簡化當然):在工廠模型中使用const_cast

class PersonFactory { 
public: 
    const Person* getPerson(const QString& newname) { 
    //I can't assign the new name because it's const 
     if(m_personCache.isEmpty()) 
      return createNewPerson(); 
     else 
      return m_personCache.pop(); 
    } 
    void returnPerson(Person* person) { m_personCache.push(person); person = 0; } 
    static PersonFactory* instance; 
private: 
    Person* createNewPerson() const { return new Person(""); } 
    QStack<Person*> m_personCache; 
} 

class Person { 
public: 
    friend Person* PersonFactory::createNewPerson(); 

    const QString& name() const { 
     return m_name; 
    } 

    void destroy() { 
     PersonFactory::returnPerson(this); 
    } 
private: 
    Person(QString name) : m_name(name) {} 
    //m_name is const and should remain that way to prevent accidental changes 
    const QString m_name; 
} 

,因爲它是const我不能指定一個新的名稱。這是const_cast的好例子,還是我錯過了一個明顯的選擇?如果使用const_cast會導致性能下降?

+0

「可變」不是設計缺陷的標誌。它就在那裏,例如,對象可以緩存值,而不是在每次需要時重新計算它們。 –

+0

我刪除了對'mutable'的引用,因爲它對問題沒有任何貢獻。當然有時它的使用被稱爲for。 – Phlucious

+0

而不是擺弄Java設計模式,可以考慮只使用C++ **小對象分配器**,如Loki庫中的一個。例如,使用Java方法,您不能使用'std :: unique_ptr'和'std :: shared_ptr'的默認值。從而對正確性和工作量產生負面影響 –

回答

0

會使用const_cast導致性能下降嗎?

也許吧。當對象實際上const產生未定義的行爲時,丟棄const以存儲值。除了別的以外,未定義的行爲可以表現爲性能問題。

+0

「當一個對象實際上是'const'時,拋棄'const'來存儲一個值會產生未定義的行爲。」你能否澄清你的意思是未定義的行爲? – Phlucious

+0

我的意思是說,語言定義對實現的功能沒有任何要求。一個簡單的例子,許多初學者遇到的是:'int main(){const int i = 3; const_cast (i)= 4; std :: cout << i <<'\ n';返回0; }'他們對程序輸出'3'感到驚訝。由於未定義的行爲,這是非常無害的。據瞭解, –

+0

。因此,使用Factory Pattern作爲實現否定'm_name'選項保留爲'const QString'?我想我可以讓它不是''contst',讓'PersonFactory'成爲'朋友類',然後直接分配它。這是否是正確的面向對象技術? – Phlucious