C++-更改对象的类型

C++ - Change the type of an object

本文关键字:类型 对象 C++-      更新时间:2023-10-16

简而言之:

一旦建立,是否可以更改对象的类型?

我尝试过的:

例如,给定设计:(编辑:为了澄清,这是一个策略设计模式的简化示例,ChangeData做什么并不重要,只是我们可以通过更改_interface来更改它做什么)

struct MyClass
{
    int _data;
    MyInterface* _interface;
    void DoChangeData() { Interface->ChangeData(*this); }
};
MyClass x;
x._interface = new DerivedClass1();
x.DoChangeData(); // do something
x._interface = new DerivedClass2();
x.DoChangeData(); // do something else

切换_interface允许我们更改对类的操作,但这需要创建包装器方法(DoChangeData),并始终将this指针作为参数传递,这很难看。

我更喜欢的更好的解决方案是:

struct MyClass abstract
{
    int _data;
    virtual void ChangeData() = 0;
};

但在这里,一旦建立了具体的类,就不能像_interface那样更改它。如果不同的派生类不添加任何新字段,这似乎是可能的。有什么方法可以实现下面的ChangeClass功能吗?

DerivedClass1 x;
x.DoChangeData(); // do something
x.ChangeClass(DerivedClass2); // ???
x.DoChangeData(); // do something else

注意,我说的是虚拟类,reinterpret_cast只适用于非虚拟对象。复制构造函数需要移动现有内存的开销,我也宁愿避免这种开销。

如果你解释实际问题,而不是如何实现你的解决方案,这类问题看起来可以得到更好的回答。

我不清楚DoChangeData应该做什么以及为什么它需要参考MyClass。问题陈述不够清楚,无法得到答案,标题(如前所述)会得到no作为答案(在C++中,你不能更改类型,这是一种强类型语言),但我理解这不是你所问的。

请澄清这个问题,以便得到满意的答案。

顺便说一句,你可能想看看Visitor设计模式和/或Strategy设计模式。

您可以在MyClass中声明函数指针并更改它们以更改类型。或者创建一个指向函数指针数组的(const指针)vtable,只需更改该指针即可更改类型。