如何创建可以在c ++中分配任何类型的对象

时间:2015-12-17 19:15:59

标签: 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
};

3 个答案:

答案 0 :(得分: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 :(得分:1)

执行此操作的纯C ++标准方法是reinterpret_cast来回void*。但是,这将要求您知道从以后回来的正确类型。

如果您对第三方解决方案持开放态度,这就是boost::any的一个此类应用程序。

话虽如此,很少有这样的事情是个好主意。通常有更好的设计来解决您的问题。坦率地说,当有人想要做这样的事情时,它是一个XY problem,他们的实际问题可以用更强大的方式解决。

答案 2 :(得分:1)

您的Color成员可能属于某种ColorType类型。类GreenBlue应来自ColorType

请参阅rbaghbanli的代码,该代码正是这样做的(接受的答案)。

然后,您可以将Green和Blue类共享的所有方面放入ColorType中,这非常有用。

如果您使用void*boost::any,则无法使用此指针进行任何操作,因为C ++会忘记它实际指向的内容。

背景:C ++完全是静态类型的,不允许内省。唯一可用的运行时机制是虚函数,这种机制非常有限。

如果你真的需要任何类型的东西,你必须自己写。但我认为你真的不需要这个。我假设您需要Can be any of a kind.,这在C ++中通过派生得到了很好的支持。