C++ - 更改对象的类型

C++ - Change the type of an object

简述:

是否可以在建立后更改对象的类型?

我试过的:

例如给定设计: (编辑:澄清一下,这是一个策略设计模式的简化示例,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 允许我们更改对 class 的操作,但是这需要创建包装器方法 (DoChangeData) 并始终将 this 指针作为争论,这是丑陋的。

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

struct MyClass abstract
{
    int _data;

    virtual void ChangeData() = 0;
};

但是这里一旦具体的class建立起来,不像_interface,就不能再改变了。如果不同的派生 classes 不添加任何新字段,这似乎应该是可能的。下面的ChangeClass功能有没有办法实现?

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

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

如果您解释实际问题而不是如何实施您的解决方案,这看起来像是可以更好地回答的问题。

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

请把问题说清楚,才能得到满意的答案。

顺便说一句,你可能想看看Visitor design pattern and/or the Strategy design pattern

您可以在 MyClass 中声明函数指针并更改它们以更改类型。或者用一个指向函数指针数组的(const 指针)创建你自己的虚表,只需改变这个指针就可以改变类型。