2011-12-13 16 views
0

私は、クラスに抽象クラスを受け入れるデータ構造を持っています。私はクラスを(クローンメソッドを介して)データ構造のプライベートフィールドの1つにコピーしたいので、構造の外に保管しておく必要はありません。 私はjsmithのでcplusplus.comにこの説明を見つけた:抽象基本クラスから派生クラスのc'torを呼び出す

// Depending upon your needs, you might not require a base class 
// clonable concept. It would only be needed if you need to store 
// clonable objects polymorphically. 
struct clonable { 
    virtual ~clonable() {} 
    virtual clonable* clone() const = 0; 
}; 

class Base : public clonable { 
public: 
    virtual Base* clone() const 
     { return new Base(*this); } 
}; 

class Derived : public Base { 
public: 
    virtual Derived* clone() const 
     { return new Derived(*this); } 
}; 

は、ここで私がこれまで持っているものです。

template <class T> 
class AbstractBase { 
public: 
    virtual AbstractBase<T>* clone() const = 0; 
    virtual int operator()(const T& lhs, const T& rhs) const = 0; 
}; 

template <class T> 
class Derived : public AbstractBase<T> { 
public: 
    Derived* clone() { return new Derived(*this); } /* ERROR: can't instantiate abstract class */ 
    int operator()(const T& lhs, const T& rhs) const { return something; } 
}; 

template <class T> 
class DataStructure { 
public: 
    DataStructure(AbstractBase<T>* base) : base(base->clone()) {} 
    //... 
private: 
    AbstractBase<T>* base; 
} 

私はそれがAbstractBaseのc'torを呼んだ実現しています。 AbstractBaseを抽象的に保ちながらこれを修正するためのエレガントかつ/または簡単な方法はありますか?

答えて

3

あなたが

Derived* clone() const; 

constをオーバーライドする必要があります。

+0

うわーソースからコピーしている間に私は同じミスを犯しました! – itchy23

関連する問題