2012-08-13 120 views
0

我做了一個通用屬性模板。每個屬性只有一個值,例如float,int,string等。當屬性被實例化時,它會嘗試向屬性管理器singleton註冊自己。但是,我無法弄清楚如何使PropertyManager :: AddProperty()方法獲取該屬性。它會通過消息指出該屬性需要一個類型名稱來保持錯誤。這通常如何完成?如何讓非模板管理器接受模板對象?

template <typename T> class Property 
{ 
public: 
    Property(T value) 
    { 
     mID = ThePropertyManager->AddProperty(Property* p); 
    } 
     T mValue; 
    ULONG mID; 
} 
+0

'PropertyManager'需要從'Property'訪問哪些操作? - 問題是調用*類型擦除*,但實現它的方式取決於你需要怎樣處理'Property' – 2012-08-13 16:39:50

+1

讓管理者接受任何事情都很困難 – 2012-08-13 16:53:09

回答

0

mID = ThePropertyManager->AddProperty(Property* p); 

是無效的語法在兩個方面,它需要

mID = ThePropertyManager->AddProperty(this); 

這是一定沒有看到你的代碼的其餘部分是很難,但只要AddProperty本身模板化,那麼這應該工作。

你也可能想在構造函數初始化mValue,即

Property(T value) : mValue(value) 
{ 
    ... 
} 
+0

AddProperty函數是一個成員函數。我是否仍然可以在不製作整個PropertyManager模板的情況下進行模板化? – user1527741 2012-08-13 17:24:21

+0

@ user1527741當然。你必須小心語法,以及'.cpp'和'.h'文件中的內容,但請參閱[here](http://stackoverflow.com/questions/1799445/function-template-in-non -template級)。 – 2012-08-13 17:45:09

0

PropertyManager的類可以有一個模板成員函數,接受物業的各種實例:

class PropertyManager 
{ 
public: 
    template <class TY> ID AddProperty(Property<Ty>&); 
}; 

還要注意的是,示例代碼不正確:

mID = ThePropertyManager->AddProperty(Property* p); 

應該是這樣的:

mID = ThePropertyManager->AddProperty(this); 
+0

啊,好點!謝謝! – user1527741 2012-08-13 17:00:02

0

你可以有一個從抽象基類繼承Property,說AbstractProperty不具有模板化的類型,然後有PropertyManager接受AbstractProperty參數。這也將支持多個Property模板類,如果您將Property與int,float等一起使用。

雖然聽起來像是你要走上需要模板化Property Manager的路徑。

+0

Uhoh,有一個模板化的房地產經理的含義是什麼?難道我不會結束多個?我只想要一位物業經理,所以我想不惜一切代價避免這種情況。但回到你的其他建議,使用抽象財產類,我喜歡這個想法。我會嘗試一下。 – user1527741 2012-08-13 16:57:47

+0

不知道「物業經理」應該做什麼,真的不可能給出有用的答案。抽象的基類可能是解決方案,但這取決於問題是什麼。 – 2012-08-13 17:09:52

+0

> Uhoh,具有模板屬性>管理器的含義是什麼?難道我不會結束多個? 也許,它會變得有點複雜,以避免有多個。 – MartyE 2012-08-13 17:38:03