РЕДАКТИРОВАТЬ: СВЯЗАНО С c ++ неопределенная ссылка на `vtable
Я пытаюсь сделать проект по наследованию, и я получаю эту ошибку:
/tmp/ccw1aT69.o: In function `main':
main.cpp:(.text+0x15): undefined reference to `Derived::Derived(int)'
/tmp/ccw1aT69.o: In function `Derived::~Derived()':
main.cpp:(.text._ZN20DerivedD2Ev[_ZN20DerivedD5Ev]+0x13): undefined reference to `vtable for Derived'
main.cpp:(.text._ZN20DerivedD2Ev[_ZN20DerivedD5Ev]+0x1f): undefined reference to `Base::~Base()'
collect2: ld returned 1 exit status
Это мой код:
main.cpp:
#include <iostream>
#include "Base.h"#include "Derived.h"
int main() {
Derived intList(25);
}
base.h:
#ifndef BASE_H
#define BASE_H
class Base {
public:
...
Base (const Base& otherList);
virtual ~Base();
protected:
int *list;
int length;
int maxSize;
};
#endif
Base.cpp:
#include "Base.h"#include <iostream>
using namespace std;
...definitions of my members...
Base::Base (int size) {
//stuff
}
Base::~Base() {
delete [] list;
}
Base::Base (const Base& otherList) {
//stuff
}
Derived.h:
#ifndef DERIVED_H
#define DERIVED_H
#include "Base.h"
class Derived: public Base {
public:
...
Derived (int size = 100);
~Derived(); //THIS LINE ADDED AFTER FIRST ANSWER
};
#endif
Derived.cpp:
#include "Derived.h"#include <iostream>
using namespace std;
Derived::Derived (int size)
:Base(size){
}
Что вызывает эту ошибку? Похоже, я не могу вызвать конструктор, но для меня это выглядит нормально.
РЕДАКТИРОВАТЬ: я попробовал первое решение. Ошибка сейчас:
/tmp/ccA4XA0B.o: In function `main':
main.cpp:(.text+0x15): undefined reference to `Derived::Derived(int)'
main.cpp:(.text+0x21): undefined reference to `Derived::~Derived()'
collect2: ld returned 1 exit status
Вы объявили виртуальный деструктор в Base
Тем не менее, вы никогда не определяете это. Это должно быть определено в Derived
(а также в Base
потому что это не чисто виртуальная функция) потому что она будет вызываться один раз main
выходы. У тебя должно быть:
class Base {
public:
// ...
virtual ~Base();
};
Base::~Base() {}
class Derived : public Base {
public:
// ...
~Derived();
};
Derived::~Derived() { /* whatever */ }
Это является причиной как минимум одной из ваших ошибок. Я не знаю, красная ли это сельдь или нет, но, похоже, это:
/tmp/ccw1aT69.o: в функции
main':
Derived :: Derived (интермедиат)»
main.cpp:(.text+0x15): undefined reference to
Вы определяете Derived::Derived(int)
Поэтому трудно представить, что это настоящая ошибка. Определите свой деструктор и посмотрите, исчезнет ли он.
Хорошо, просто для ясности, и так как я не могу поместить отформатированный код ни в чем, кроме ответа. Вам НЕ нужно предоставлять деструктор в производном классе только потому, что в вашем базовом классе есть виртуальный dtor или чистые методы. Следующее настолько просто, насколько я могу продемонстрировать это в трех различных условиях конструирования / разрушения. вывод указан после кода. Надеюсь, это поможет @Jeff. Я проверил это под VS2005 / 2008/2010 и древним gcc 4.1.2, так что лучше быть правым.
#include <iostream>
class Base {
public:
Base()
{ std::cout << "Base()" << std::endl; };
virtual void call_me() = 0;
virtual ~Base()
{ std::cout << "~Base()" << std::endl << std::endl; };
};
class Derived : public Base {
public:
Derived(int i=1)
{ std::cout << "Derived(" << i << ")" << std::endl; }
// Base::call_me requirements.
void call_me()
{ std::cout << "call_me()" << std::endl; }
};
int main(int argc, char* argv[])
{
// use derived class pointer type
Derived* pDerived = new Derived();
pDerived->call_me();
delete pDerived;
// use base class pointer type
Base* pBase = new Derived(2);
pBase->call_me();
delete pBase;
// scope based
{
Derived obj(3);
obj.call_me();
}
return 0;
}
Выход для этого:
Base()
Derived(1)
call_me()
~Base()
Base()
Derived(2)
call_me()
~Base()
Base()
Derived(3)
call_me()
~Base()
main.cpp:(.text+0x15): undefined reference to `Derived::Derived(int)'
Это сообщение об ошибке не говорит неопределенную ссылку на учебный класс как говорит вопрос о вашем названии. Скорее это жалуется на неопределенную ссылку на конструктор который принимает параметр int. Из моего беглого взгляда на ваш код, вы только объявили этот конструктор и не определили его. Добавьте определение в ваш файл .cpp, и вы должны решить эту ошибку.
Кроме того, обычной практикой является размещение объявлений конструктора перед всеми объявлениями функций-членов. Сначала я пропустил эти заявления, потому что они были не там, где я ожидал. Я настоятельно рекомендую вам сделать это, чтобы избежать недопонимания в будущем, когда вы будете задавать вопросы здесь.