2015-12-17 54 views
1

我有一個類定義是這樣的對象:如何創建可分配任何類型的C++

class Paint{ 
AnyType* Color; 
}; 

我想要做的就是創建一個類(ANYTYPE),其對象可以被分配任何對象任何類的類型。像這樣:

class Blue{}; 
class Green {};` 

Paint MyPaint; 
MyPaint.Color = new Green(); 
// color gets changed 
MyPaint.Color = new Blue(); 

我該如何聲明AnyType?

Class AnyType{ 
//class definition 
}; 
+1

所以你想要一個'void *'? – NathanOliver

+1

字面上問的答案是'void *',但似乎並沒有正確指出這個要求。相反,我認爲你真的想要'綠色'和'藍色'來源於一些常見的基礎類型。 – JSF

+0

@JSF同意。我只是不確定他們是否只想要顏色對象或任何對象。 – NathanOliver

回答

3
class Paint{ 
BaseColor* Color; 
}; 

class BaseColor {} 

class Blue : BaseColor {}; 
class Green : BaseColor {};` 

Paint MyPaint; 
MyPaint.Color = new Green(); 
// color gets changed 
MyPaint.Color = new Blue(); 
1

純C++標準的方式來做到這一點,將是reinterpret_castvoid*來回。但是,這會要求您知道正確的類型,以便在以後繼續使用。

如果您願意接受第三方解決方案,這是boost::any的一個此類應用程序。

這就是說,有這樣的事情很少會是一個好主意。通常有更好的設計來解決你的問題。坦率地說,當有人想要做這樣的事情時,這是一個XY problem和他們的實際問題可以用更強大的方式解決。

1

您的Color成員應該可能是某種ColorType類型。 GreenBlue的類應該從ColorType得出。

請參閱rbaghbanli的代碼,確切地說這(接受的答案)。

然後,您可以將類Green和Blue共享的所有方面都放到ColorType中,這非常有用。

如果用戶使用void*boost::any這個指針沒有任何用處,因爲C++忘記了它實際指向的內容。

背景:C++是完全靜態類型的,不允許內省。唯一可用的運行時機制是虛擬功能,而且這種機制非常有限。

如果您確實需要可以是任何類型的東西,您必須親自編寫它。但我認爲你並不需要這個。我假設你需要Can be any of a kind.,這在C++中得到了充分的支持。

+0

你能告訴我如何聲明一個可以是任何類型的變量? –

+0

我沒有寫'可以是任何形式'。我寫了'可以是任何一種',例如'可以是任何顏色'。看到接受的答案,這表明如何做到這一點。 –

相關問題