2015-04-02 2 views
-1

Я пытаюсь реализовать структуру данных списка в C++.Интерфейс C++ Template (реализация списка)

Я хочу определить интерфейс списка, который позже будет унаследован реализацией, такой как ArrayList или LinkedList.

Я хотел бы иметь возможность использовать его как

List<int>* testList = new LinkedList<int>; 

Так что я попытался реализовать полный виртуальный шаблонный класс, но потом понял, что я не могу смешивать виртуальные и шаблонные методы. Я пробовал много разных способов, и я сталкивался с проблемами на всем пути.

Каков наилучший способ сделать это?

Редактировать (проблемный код). Я пытаюсь сделать интерфейс выглядеть следующим образом:

template<typename T> 
class List { 
public: 
    virtual void add(T*) {}; 
    virtual void remove(unsigned int) = 0; 
    virtual unsigned int size() = 0; 
    virtual void get(unsigned int) = 0; 

    virtual ~List(); 
}; 

, а затем им пытается реализовать здесь:

template<typename T> 
class LinkedList : public List<T> { 
/* some stuff */ 
public: 
    LinkedList(); 

    virtual unsigned int size(); 
    virtual void add(T*); // the problem i guess 
    virtual void remove(unsigned int); 
    virtual void get(unsigned int); 

    virtual ~LinkedList(); 
}; 
+2

Для этого вам не нужны шаблоны виртуальных функций, достаточно всего шаблона для всего интерфейса/класса. Можете ли вы показать код, который дает вам проблемы? – Angew

+0

Просьба предоставить часть проблемного исходного кода. Вы не можете смешивать виртуальные и шаблонные методы, но вы можете иметь виртуальные методы в шаблонных классах. Это должно быть сделано для ваших нужд. – Spook

+1

Пожалуйста, не надо. 'std :: vector',' std :: list'. Не делайте Java на C++. – Griwes

ответ

0

Так что я пытался реализовать полный виртуальный шаблонный класс, а затем понял, я не могу смешивать виртуальные и templat ed методов.

Ваш пример кода указывает, что вам не нужны виртуальные шаблонные методы, но класс шаблона, который имеет виртуальные методы. Первый не допускается, последний IS (это общая точка путаницы).

Так что это совершенно правильный код:

#include <iostream> 
#include <memory> 

template<class T> 
class List{ 
public: 
    virtual void push()=0; 
    virtual void pop()=0; 
    virtual ~List()=default; 
}; 

template<class T> 
class LinkedList: public List<T>{ 
public: 
    virtual void push() { 
     std::cout << "Pushed element to Linked List"<< std::endl; 
    } 
    virtual void pop() { 
     std::cout << "Poped element from Linked List"<< std::endl; 
    } 
}; 

template<class T> 
class ArrayList: public List<T>{ 
public: 
    virtual void push() { 
     std::cout << "Pushed element to ArrayList"<< std::endl; 
    } 
    virtual void pop() { 
     std::cout << "Poped element from ArrayList"<< std::endl; 
    } 
}; 

int main() 
{ 

    List<int>* list1=new LinkedList<int>(); 
    List<int>* list2=new ArrayList<int>(); 
    // And this is how you would actually create objects on the heap nower days: 
    std::unique_ptr<List<int>> list3=std::make_unique<LinkedList<int>>(); 

    list1->push(); 
    list2->push(); 
    list3->push(); 

    list1->pop(); 
    list2->pop(); 
    list3->pop(); 

    delete(list1); 
    delete(list2); 
    //no delete(list3) needed 
    return 0; 
} 

Кроме того, я не знаю, почему вы хотите, чтобы сделать это. C++ имеет прекрасную реализацию связанного списка и реализации и массива/вектора и благодаря семантике, основанной на итераторе, вы можете запускать (почти) любой алгоритм на них без необходимости использования общего базового класса.

Прошу прощения, если это звучит резким, но похоже, что вы отправляетесь с Java и пытаетесь изучить C++. Но вместо изучения C++ вы пытаетесь написать обертки, которые делают C++ похожим на java. Хотя это, безусловно, возможно большую часть времени (пока вы не забудете, что в стандартном C++ нет сборщика мусора), это часто не разумный подход. независимо от того, что верно в вашем случае, конечно, зависит от вашего приложения. Но моя рекомендация - узнать об итераторах и стандартных библиотечных алгоритмах.

Смежные вопросы