我有一个抽象基类来执行一些子类来重载运算符。复制抽象基类的子类
我在std :: stack中存储了一堆指向这些子类的实例的指针......在某些时候,我希望复制堆栈的顶层项目(并将其推到顶部)。
问题是,我无法实例化一个抽象类。很明显,因为我想为我的每个子类做这件事,所以我不知道类型...
我不知道这是甚至可能没有添加另一个纯粹的虚拟方法(说'Base * clone()= 0')并在我的每个子类中实现它?当然必须有一个更清洁的方式。
我有一个抽象基类来执行一些子类来重载运算符。复制抽象基类的子类
我在std :: stack中存储了一堆指向这些子类的实例的指针......在某些时候,我希望复制堆栈的顶层项目(并将其推到顶部)。
问题是,我无法实例化一个抽象类。很明显,因为我想为我的每个子类做这件事,所以我不知道类型...
我不知道这是甚至可能没有添加另一个纯粹的虚拟方法(说'Base * clone()= 0')并在我的每个子类中实现它?当然必须有一个更清洁的方式。
我想你在这种情况下实际上需要一个Clone
方法。您希望在运行时动态复制子类项目,并且在运行时更改行为的常规方法是虚拟方法。如果不使用某种虚拟方法,您将无法确定它是哪个孩子。你也许可以使用CRTP自动生成克隆你,但:
// Totally uncompiled and untested.
class Base
{
public:
virtual Base* Clone() const = 0;
};
template <class T>
class Child : public Base
{
public:
virtual Base* Clone() const { return new T(*static_cast<T*>(this)); }
protected:
Child(); // Can't instantiate directly
Child(const Child& right); // Can't instantiate directly
};
class Grandchild : public Child<Grandchild>
{
// Clone should do the right thing.
};
你的意思是使类的副本,而不是复制指针。
您将需要实现自己的输入。换句话说有一个虚函数返回类的类型,然后创建合适的类
或者启用RTTI(运行时类型信息)来做同样的事情。因为RTTI对每个类都有影响,因此可以更有效地创建自己的类型方法。
然后你就可以
psuedocode
base* ptr = stack.pop()
base *copy
switch (ptr->typeof()) {
case class1type : copy = new class1(ptr) break;
case class2type : copy = new class2(ptr) break;
...
}
stack.push (ptr)
stack.push(copy)
DC
完美!非常感谢。 – 2011-02-02 05:59:17