2013-02-08 5 views
3

Я пытаюсь реализовать стек и очередь. Мне также предоставлен код для проверки как стека, так и очереди (чтобы проверить, правильно ли работают их соответствующие функции).«Ожидаемое имя класса» ... Проблема в реализации деструктора

Я реализовал функции как стеки и quete ,, но при попытке скомпилировать их я получаю ошибку: В деструкторе `Stack :: ~ Stack()» ожидаемых классового имени до „(“ . лексема
в обоих из них

Ниже приводится общий класс Stack:

template <class T> 
class Stack 
{ 
    List<T> list; 
public: 

    Stack(); 

    Stack(const Stack<T>& otherStack); 

    ~Stack(); 
} 

класс List:

template <class T> 
class List 
{ 
    ListItem<T> *head; 

    public: 

    List(); 

    List(const List<T>& otherList); 

    ~List(); 
} 

Теперь деструктор класса List работает нормально. Поэтому, учитывая это, моя реализация для деструктора была такой:

template <class T> 
Stack<T>::~Stack() 
{ 

       list.~List(); 
} 

Что я здесь делаю неправильно?

+2

Не вызывайте деструктор явно - язык позаботится об этом для вас. – molbdnilo

+1

Потеряйте 'list. ~ List()' call. Этот член будет самоуничтожиться. – WhozCraig

+0

@ molbdnilo, @WhozCraig Спасибо, ребята, сейчас работает! – mrsinister

ответ

6

Вы должны (почти) никогда не вызывать деструктор явно. Когда закончится ваша жизнь Stack, она автоматически вызовет деструкторы своих членов. Вам не нужно ничего делать. list будет уничтожен автоматически.

Если у вас есть указатель, p, к динамически выделяемому объекту в качестве члена, того вам нужно будет сделать некоторые очистки в деструкторе, делая delete p;. Но здесь вы этого не делаете. list будет уничтожен автоматически.

+2

+1, размещение-новые реализации не выдерживают = P – WhozCraig

+0

Я вижу. Я пробовал это, и он работает. Большое спасибо! – mrsinister

+0

@WhozCraig Добавил «почти». : D –

5

Ваш член list - это автоматическая переменная. Его время жизни (время, когда его конструктор и деструктор обращаются) управляется языком. Как только объект, содержащий объект, выходит из области видимости, вызывается деструктор List.

Это говорит о наличии веских причин для прямого вызова деструктора (у вас его нет, и вы его редко будете), и для этого вам нужно правильно указать тип.

В вашем случае это будет

list.~List<T>(); 

сам List является шаблоном, а не тип.

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