我有这样的课程定义:
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
};
答案 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
类型。类Green
和Blue
应来自ColorType
。
请参阅rbaghbanli的代码,该代码正是这样做的(接受的答案)。
然后,您可以将Green和Blue类共享的所有方面放入ColorType中,这非常有用。
如果您使用void*
或boost::any
,则无法使用此指针进行任何操作,因为C ++会忘记它实际指向的内容。
背景:C ++完全是静态类型的,不允许内省。唯一可用的运行时机制是虚函数,这种机制非常有限。
如果你真的需要任何类型的东西,你必须自己写。但我认为你真的不需要这个。我假设您需要Can be any of a kind.
,这在C ++中通过派生得到了很好的支持。