проблема наследования c ++ "неопределенная ссылка на" - PullRequest
1 голос
/ 15 марта 2011

Во время практики наследования в c ++ я продолжал получать следующую ошибку:

base1.o: в функции Base1::Base1()': base1.cpp:(.text+0x75): undefined reference to Base2 :: Base2 () 'base1.o: в функции Base1::Base1()': base1.cpp:(.text+0xa5): undefined reference to Base2:: Base2 () 'collect2: ld вернул 1 состояние выхода make: * [test] Ошибка 1

Я удалил весь ненужный код, так что осталось только это:

base1.h :

#include "base2.h"
#ifndef BASE1_H_
#define BASE1_H_

class Base1 : public Base2 {  

public:
Base1();   
};

#endif

base1.cpp :

#include <QStringList>
#include <QTextStream>
#include "base1.h"
#include "base2.h"

QTextStream cout(stdout);
QTextStream cin(stdin);

Base1::Base1() : Base2() {
cout << "\nB1\n\n" << flush;
}

base2.h :

#ifndef BASE2_H_
#define BASE2_H_

class Base2 {

public:
Base2();
};

#endif

base2.cpp :

#include <QStringList>
#include <QTextStream>
#include "base2.h"

QTextStream cout(stdout);
QTextStream cin(stdin);


Base1::Base1() {
cout << "\nB2\n\n" << flush;   
}

child.cpp :

#include <QStringList>
#include <QTextStream>
#include "base1.h"
#include "base2.h"

QTextStream cout(stdout);
QTextStream cin(stdin);


Base1::Base1() {
cout << "\nB2\n\n" << flush;
}

Это, вероятно,простая проблема, но я потратил около 2 часов на поиск решения в Google и ничего не нашел, поэтому я был бы признателен за любую помощь.


Привет,

спасибо всемза ваши ответы до сих пор.

Я изменил base2.cpp на:

#include <QStringList>
#include <QTextStream>
#include "base2.h"

QTextStream cout(stdout);
QTextStream cin(stdin);


Base2::Base2() {
cout << "\nB2\n\n" << flush;
}

однако я все еще получаю ту же ошибку.Я думаю, что это как-то связано с "#include", но я не знаю, как это сделать правильно: (.

Ответы [ 4 ]

2 голосов
/ 15 марта 2011

Вы не реализовали

Base2::Base2();

Но ты использовал это. Вот почему его неопределенная ссылка (ошибка ссылки)

В base2.cpp замените Base1 :: Base1 () на Base2 :: Base2 (), и это исправит.

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

2 голосов
/ 15 марта 2011

Возможно, опечатка, но в base2.cpp должно быть написано Base2::Base2() вместо Base1::Base1()

2 голосов
/ 15 марта 2011

Вы определили Base1::Base1() в трех файлах .cpp и совсем не определили Base2::Base2().

Вам необходимо определить каждую функцию-член ровно один раз .

2 голосов
/ 15 марта 2011

Очень просто: вы объявляете Base2(), но никогда не определяете его.Вы должны, даже если он пустой ... или вообще не объявлять, и для вас будет сгенерирован пустой.

Возможно, Base1::Base1() в base2.cpp должно читаться как Base2::Base2()?

child.cpp не должен иметь определения ни для одного из них.

Редактировать Вы сказали, что у вас все еще есть проблемы.

Я собираюсь предположить, что вы обратили внимание на вышесказанное и удалили постороннее определение Base1::Base1() из child.cpp.

Как вы строите свой проект?Это должно быть примерно так:

 g++ base1.cpp base2.cpp child.cpp -o myProgram

или примерно так:

 g++ base1.cpp -o base1.o
 g++ base2.cpp -o base2.o
 g++ child.cpp -o child.o
 g++ base1.o base2.o child.o -o myProgram

(что часто является результатом работы с make-файлом или другими автоматическими процессами сборки).

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