【发布时间】:2010-08-17 19:09:47
【问题描述】:
我遇到了一个具有挑战性的问题,该问题一直无法解决 - 希望到现在为止。我正在开发自己的框架,因此试图为用户提供灵活性以及所有代码复杂性。
首先我有一个用户可以实现的抽象基类,显然是简化的:
class IStateTransit
{
public:
bool ConnectionPossible(void) = 0;
}
// A user defines their own class like so
class MyStateTransit : public IStateTransit
{
public:
bool ConnectionPossible(void){ return true; }
}
接下来,我定义了一个工厂类。用户可以注册他们自己的自定义状态传输对象,稍后只需使用他们选择的字符串标识符来引用它们:
class TransitFactory : public Singleton<TransitFactory>
{
public:
template<typename T> void RegisterStateTransit(const string& name)
{
// If the transit type is not already registered, add it.
if(transits.find(name) == transits.end())
{
transits.insert(pair<string, IStateTransit*>(name, new T()));
};
}
IStateTransit* TransitFactory::GetStateTransit(const string& type) const
{
return transits.find(type)->second;
};
private:
map<string, IStateTransit*> transits;
}
现在的问题是(可能很明显)当用户通过调用GetStateTransit 请求中转时,系统当前会不断返回相同的对象——指向相同对象的指针。我想改变它。
问题:如何在用户不必定义自己的复制构造函数或virtual constructor 的情况下返回原始IStateTransit 对象的新(克隆)。理想情况下,我希望GetStateTransit 方法能够将 IStateTransit 对象转换为它在运行时的派生类型并返回该实例的克隆。最大的障碍是我不希望用户必须实现任何额外(并且可能很复杂)的方法。
4 小时的谷歌搜索和尝试让我无处可去。有答案的就是英雄!
【问题讨论】:
-
顺便说一句:
IStateTransit::ConnectionPossible等基类成员需要是虚拟的。此外,您应该提供一个虚拟析构函数(它什么都不做),以便delete通过基指针对派生实例进行良好定义。 -
@Evan:你是对的,我也是。我没有复制就输入了代码并忘记了......
标签: c++ copy abstract-class clone