2014-11-22 6 views
-2

У меня есть абстрактный класс Icollection вроде этого:экземпляр абстрактного класса в C++

using namespace std; 

template <typename T> 
class ICollection 
{ 
public: 
    virtual void add(T) = 0; 
    virtual T get(int) = 0; 
    virtual int count() = 0; 
}; 

и производный класс ArdalanCollection так:

#include "iCollection.h" 
#include <map> 
template <typename T> 
class ArdalanCollection :public ICollection<T> 
{ 
public: 
    ArdalanCollection(){ 
     index = 0; 
    }; 
    virtual void add(T obj){ 
     encapsolateImplementation.insert(make_pair(index++, obj)); 
    }; 
    virtual T get(int index){ 
     return encapsolateImplementation[index]; 
    }; 

    virtual int count(){ 
     return index; 
    } 
private: 
    int index; 
    map < int, T > encapsolateImplementation; 
}; 

теперь я другой абстрактный класс с именем abs_class, как это :

class abs_class 
{ 
public: 
    abs_class(){}; 
    virtual int getT(int) = 0; 
protected: 
    int Kg; 
}; 

что я хочу сделать строит объект Icollection типа abs_class, другими словами, я хочу сделать это:

ICollection<abs_class> *eles = new ArdalanCollection <abs_class>(); 

но я резонно получил эту ошибку:

error C2259: 'abs_class' : cannot instantiate abstract class

есть ли способ, чтобы включить эту ошибку?

ответ

2

Вы указываете abs_class как тип шаблона T, но T должна быть конструктивна, так как add принимает значение T по значению и get возвращает значение T.

С abs_class является чисто виртуальным, он не может быть создан. Вместо этого вы можете использовать abs_class* или предоставить унаследованный класс с определенным членом getT.

+0

Да, на самом деле я уже сделал ваше второе лекарство, но как-то мне нужно было использовать ваш первый! Спасибо за объяснение. – Alexander1991

1

Вы не можете создать экземпляр абстрактного класса. Это означает, что вы не можете использовать: -

ICollection<abs_class> *eles; 

Однако вы можете сделать это: -

ICollection<abs_class*> *eles; 
Смежные вопросы