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 指针)创建你自己的虚表,只需改变这个指针就可以改变类型。
简述:
是否可以在建立后更改对象的类型?
我试过的:
例如给定设计:
(编辑:澄清一下,这是一个策略设计模式的简化示例,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 指针)创建你自己的虚表,只需改变这个指针就可以改变类型。