【问题标题】:How to create objects which can be assigned any type in c++如何在 C++ 中创建可以分配任何类型的对象
【发布时间】:2016-03-24 09:19:08
【问题描述】:

我有一个这样的类定义:

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
};

【问题讨论】:

  • 所以你想要void*
  • 问题的答案是void*,但问题似乎没有正确识别需求。相反,我认为您确实希望 GreenBlue 派生自一些常见的基本类型。
  • @JSF 同意。我只是不确定他们是否只想要颜色对象或任何可能的对象。

标签: c++


【解决方案1】:

您的Color 成员可能应该属于ColorType 类型。并且类GreenBlue 应该派生自ColorType

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

然后你可以把Green和Blue类共享的所有方面都放到ColorType中,这非常有用。

如果您使用void*boost::any,则无法使用此指针做任何事情,因为 C++ 忘记了它实际指向的内容。

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

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

【讨论】:

  • 你能告诉我如何声明一个可以是任何类型的变量吗?
  • 我没有写过“可以是任何类型的”。我写了“可以是任何一种”,例如“可以是任何颜色”。请参阅接受的答案,这显示了如何执行此操作。
【解决方案2】:
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();

【讨论】:

    【解决方案3】:

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

    如果您愿意接受第 3 方解决方案,这是boost::any 的此类应用之一。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多