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
允许我们更改对类的操作,但这需要创建包装器方法(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,只需更改该指针即可更改类型。
相关文章:
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- C++ 多态模板类,模板类型对象的实例化
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- 如何构造一个 std::variant 类型对象,其自身 Templated 和构造函数转发参数
- C++:初始化指向具有不同类型对象的指针数组
- 在类 C++ 中构造的模板类型对象
- 如何将颁发者名称设置为x509_req类型对象
- 将任何数据类型/对象作为参数传递以确定其大小
- 将引用类型对象的数组从C#封送到C++
- <T> 从类型对象创建类型<T1>对象的构造函数
- C++是否有现有的方法来检查对象是否是派生类型对象
- C 模板:创建与现有对象相同的类型对象
- 链接列表中的虚函数 - 多种返回类型(对象)
- 没有适当操作员()的类型对象的呼叫
- 制作垫子类型对象的数组.输出窗口显示同一帧
- 抽象类型对象的分配
- 在std::list中就地创建自定义类型对象
- 接受泛型列表类型对象的参数
- C++-将模板类型对象强制转换为特定的数据类型
- 试图在C++中打印存储在类型对象数组中的信息