2013-04-23 44 views
0

我正在使用特定的類庫。所有可用的值類都是從基類派生的。有標量類型如何爲非創建類創建包裝?

oaBooleanValue : public oaValue 
oaIntValue  : public oaValue 
oaFltValue  : public oaValue 
oaStringValue : public oaValue 

前3個類定義方法get()作爲返回值。第四類定義爲獲取參考。

oaBoolean get() const; 
oaInt  get() const; 
oaFloat get() const; 
void  get(oaString& value) const; 

我需要在我的模板包裝類中統一使用所有4個類。 我寫了如下的輔助oaStringValueGetter類。但是有問題。基類oaValue限制默認構造函數和複製構造函數。只有一種通過使用靜態'create()'方法來創建實例的方法。

是否有任何方法可以將一些類型轉換方法添加到我的類中,以便它會自動從oaStringValue轉換?

class oaStringValueGetter : public oaStringValue 
{ 
public: 
    oaString get() const 
    { 
    oaString str; 
    oaStringValue::get(str); 
    return str; 
    } 
}; 

這裏是從庫中提取的,用於參考

class oaObject { 
public: 
    // public methods are here 

protected: 
    ~oaObject(); 

private: 
    oaObject(); 
    oaObject(const oaObject& obj); 

    oaObject& operator=(const oaObject& obj); 
}; 

class oaValue : public oaObject { 
public: 
    void     destroy(); 
    oaBoolean    isEqual(oaValue *value) const; 
    oaValue     *copy() const; 
}; 

class oaString; // library-defined custom string class 

class oaStringValue : public oaValue { 
public: 
    static oaStringValue* create(oaObject* database, const oaString &value); 

    void get(oaString& value) const; 
    void set(const oaString& value); 
}; 

typedef int oaInt4; 

class oaIntValue : public oaValue { 
public: 
    static oaIntValue* create(oaObject* database, oaInt4 value); 

    oaInt4 get() const; 
    void set(oaInt4 value); 
}; 
+0

如果一個類限制了它的所有構造函數,那麼就不可能對它進行子類化。 'oaValue'是否有任何公共構造函數? – 2013-04-23 17:43:21

+0

你說得對。用給定的條件編寫「class oaStringValueGetter:public oaStringValue」是不可能的。我以不同的方式解決了我的任務。 – 2013-05-23 10:32:50

回答

2

我想你混淆了一個包裝VS子類的概念,部分類定義。

包裝並不一定包含所包含的類,它可以由包含的類的實例組成,其中對構成類的調用委託給組合類而不是直接繼承。

在你的情況下,讓包裝包含包裝類的實例,然後委派調用可能會更容易。

+0

你說得對。在我的情況下,還有一個條件我最初沒有提到:) oaObject派生類僅由框架創建。他們是混亂的對象。如果我將自己的課程分類,則不會由框架處理。所以,這裏的各種解決方案非常有限。最後我通過編寫更多的源代碼來解決它。 – 2013-05-23 10:46:23

+0

@VadimSukhorukov這很好,你解決了它。現在發佈一個答案,並將其標記爲正確,以便其他人可以一目瞭然地看到您的問題已得到回答。 :) – Casey 2013-05-23 16:27:19

1

嘗試通過返回對象的get()方法的結果來創建一個模板函數,用於從類型爲T的對象獲取值。這將是標量的默認實現。然後對此模板進行專門化,其中T = oaString和臨時oaString變量用於根據您的界面需要獲取字符串值。作爲結果返回該變量。希望對你有所幫助