Ошибка ссылки на символ C ++ - PullRequest
0 голосов
/ 04 декабря 2010

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

Undefined                       first referenced
 symbol                             in file
stack_error::~stack_error()         /var/tmp//ccFwZ5Kd.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status

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

class stack_error : public exception
{
public:
   stack_error(string const& m) throw()
      : exception(), msg(m) {};
   virtual ~stack_error() throw() =0;
   virtual const char* what() const throw()
   {
      return msg.c_str();
   }

private:
   string msg;
};

class stack_full_error : public stack_error
{
public:
   stack_full_error() throw()
      : stack_error("Exception: stack full") {};
   ~stack_full_error() throw() {};
};

И вот здесь я впервые называю исключение

template <class T>
void Stack<T>::push(T i)
{   
   if(is_full())
      throw stack_full_error();

   this->first = new Node<T>(this->first, i);
   amount++;
}

Ответы [ 3 ]

2 голосов
/ 04 декабря 2010

Виртуальный или нет, stack_error должен определить его деструктор, потому что он неявно вызывается из деструктора stack_full_error.Вы должны добавить:

stack_error::~stack_error() {}

в файл реализации.

1 голос
/ 04 декабря 2010

У вас не может быть абстрактного деструктора.Вы должны определить это в stack_error.(см. исправление ниже)

Вы хотели включить в virtual ?

В отличие от других виртуальных функций, виртуальные деструкторы не перекрывают друг друга.Деструкторы всех базовых классов будут выполняться последовательно (начиная с самого деструктора самого производного класса).У каждого класса должен быть деструктор;даже если вы не определили деструктор, он создается неявно.

Исправление:
Вы можете сделать деструктор абстрактным, но в любом случае необходимо определить его тело.Вот так:

virtual ~stack_error() = 0 {};

если это ваш компилятор с новейшими функциями C ++ 0x.В противном случае вы должны определить тело снаружи:

class stack_error
{
    ...
    virtual ~stack_error() = 0;
    ...
};
stack_error::~stack_error() {}

Abstract (=0) означает, что оно должно быть определено в производных классах;тем не менее, вы должны определить тело деструктора.

0 голосов
/ 04 декабря 2010

Я не уверен, что деструкторы могут (должны?) Быть абстрактными. Деструкторы должны быть виртуальными , но я помню, что когда они абстрагировались, возникали проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...