简单来说:
一旦建立,是否可以更改对象的类型?
我尝试过的:
例如给定设计:
(编辑:为了澄清,这是一个战略设计模式的简化示例,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.
问题陈述不够清楚,无法得到答案,标题(如上所述)会得到一个答案(在C中你不能改变类型,是一种强类型语言),但我明白不是你的意思问.
请澄清问题,以便能够得到满意的答案.
顺便说一句,你可能想看看Visitor design pattern和/或Strategy design pattern.