Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование абстрактного класса, ошибка при создании объекта. 
:(
    Опции темы
Bugmaker
Дата 25.10.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



Здравствуйте.
Есть следующий код. Это часть примера из книги "С++ за 21 день".

Код

#include <iostream>
using namespace std;

enum {kIsSmaller, kIsLarger, kIsSame};

class Data
{
      public:
             Data(int val):myValue(val){};
             ~Data(){};
             int Compare(const Data &);
             void Show() {cout << myValue << endl;}
      private:
              int myValue;
};
int Data::Compare(const Data & theOtherData)
{
    if (myValue < theOtherData.myValue)
       return kIsSmaller;
    if (myValue > theOtherData.myValue)
       return kIsLarger;
    else
        return kIsSame;
}

class Node;
class HeadNode;
class TailNode;
class InternalNode;

class Node
{
      public:
             Node(){};
             virtual ~Node(){};
             virtual Node* Insert(Data * theData)=0;
             virtual void Show() = 0;
             private:
};

class InternalNode:public Node
{
      public:
             InternalNode(Data * theData, Node * next);
             ~InternalNode(){delete myNext; delete myData;}
             virtual Node * Insert(Data * theData);
             virtual void Show() {myData->Show(); myNext->Show();}
      private:
              Data * myData;
              Node * myNext;
};

InternalNode::InternalNode(Data * theData, Node * next):
                                myData(theData), myNext(next)
{
}


int main()
{
system("pause");
return 0;
}




Среда разработки Devc++, выдает ошибки:
  [Linker error] undefined reference to `vtable for InternalNode' 
  [Linker error] undefined reference to `vtable for InternalNode' 
  ld returned 1 exit status 

Насколько я понимаю, какой-то косяк при создании объекта конструктором - InternalNode(Data * theData, Node * next);

Не могу понять где я опечатался, или в чем ошибка.
PM MAIL   Вверх
bsa
Дата 25.10.2010, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Bugmaker, ты объявил метод Insert у InternalNode, но забыл его определить. А так как он виртуальный, то и возникла такая ошибка.
PM   Вверх
Bugmaker
Дата 25.10.2010, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



Вот я растыка... Просто в процессе написания программы, выработалась привычка почаще запускать компиляцию и исправлять ошибки, чтобы в конце было проще разобраться. Спасибо.
PM MAIL   Вверх
djamshud
Дата 25.10.2010, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



Bugmaker, у меня тоже была такая привычка. Без нее лучше, отвыкайте:). Написал - скомпилировал - исправил - скомпилировал - запустил. И все.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
xvr
Дата 26.10.2010, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(bsa @  25.10.2010,  13:45 Найти цитируемый пост)
Bugmaker, ты объявил метод Insert у InternalNode, но забыл его определить.
Угу. Маленькое уточнение - gcc кладет таблицу виртуальных методов класса в объектный модуль, где находится тело первой виртуальной (но не pure virtual) функции этого класса.
В данном случае так случилось, что такого модуля вообще не оказалось (т.к. функцию Insert  забыли написать), на что линкер и выругался, что не смог найти таблицу виртуальных методов InternalNode. А понадобилась она ему в процессе компиляции тела конструктора InternalNode (его написать не забыли)



PM MAIL   Вверх
mes
Дата 26.10.2010, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(xvr @  26.10.2010,  11:56 Найти цитируемый пост)
де находится тело первой виртуальной 

ммм.. а разве, если б не было тела второго виртуального метода , то была б другая ошибка ? 


Это сообщение отредактировал(а) mes - 26.10.2010, 13:03


--------------------
PM MAIL WWW   Вверх
xvr
Дата 26.10.2010, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(mes @ 26.10.2010,  13:03)
Цитата(xvr @  26.10.2010,  11:56 Найти цитируемый пост)
де находится тело первой виртуальной 

ммм.. а разве, если б не было тела второго виртуального метода , то была б другая ошибка ?

Да, тогда бы он ругался, что не нашел InternalNode::Show() (это 2я функция)


PM MAIL   Вверх
mes
Дата 26.10.2010, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(xvr @  26.10.2010,  12:25 Найти цитируемый пост)
Да, тогда бы он ругался, что не нашел InternalNode::Show() (это 2я функция)

Код

struct i {
  virtual void f1 () =0;
  virtual void f2 () =0;
  
};

struct t : i {
  virtual void f1 (){}
  virtual void f2();
};

int main ()
{
 t test;
}

хм..
Цитата

(.text._ZN1tC2Ev[_ZN1tC5Ev]+0x16): undefined reference to `vtable for t'


или я не так чего то понял ?


http://liveworkspace.org/code/0bff868764e9...cf31f9a5f980443
или на лвс не gcc ? 
 smile 

Это сообщение отредактировал(а) mes - 26.10.2010, 13:42


--------------------
PM MAIL WWW   Вверх
xvr
Дата 26.10.2010, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(mes @  26.10.2010,  13:41 Найти цитируемый пост)

или я не так чего то понял ?
Она должна быть не pure virtual и не inline (про эту часть я забыл упомянуть)

Код

struct i {
  virtual void f1 () =0;
  virtual void f2 () =0;
  
};
struct t : i {
  virtual void f1 ();
  virtual void f2();
};
int main ()
{
 t test;
}

void t::f1 () {}



Код

> g++ t.cc 
/tmp/cciww64e.o(.gnu.linkonce.r._ZTV1t+0x18): undefined reference to `t::f2()'
collect2: ld returned 1 exit status

PM MAIL   Вверх
Bugmaker
Дата 26.10.2010, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



Спасибо, за поясьнение.
Что такое pure virtual?)
PM MAIL   Вверх
mes
Дата 26.10.2010, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(xvr @  26.10.2010,  12:51 Найти цитируемый пост)
Она должна быть не pure virtual и не inline (про эту часть я забыл упомянуть)

спасибо )


Цитата(Bugmaker @  26.10.2010,  13:35 Найти цитируемый пост)
Что такое pure virtual?) 

"помеченная нулем" smile

Цитата(xvr @  26.10.2010,  12:51 Найти цитируемый пост)
virtual void f2 () =0;




--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0759 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.