Неопределенная ссылка при включении заголовка в C ++ - PullRequest
0 голосов
/ 08 января 2011

Я работал над своим проектом, когда решил, что должен разбить его на файлы.Однако я застрял с такой проблемой, и все советы, которые я нашел через Google, были о том, что нужно забыть связать оба объектных файла, что я делаю правильно (по крайней мере, я так думаю).

test : class.o main.o
 g++ class.o main.o -o test.exe

main.o : main.cpp
 g++ main.cpp -c

class.o : class.cpp
 g++ class.cpp -c

main.cpp

#include <iostream>
#include "class.h"
using namespace std;

int main() {
 Trida * t = new Trida(4);
 t->fce();
 return 0;
}

class.h

#ifndef CLASS
#define CLASS
class Trida {
private:
 int a; 
public:
 Trida(int n); 
 void fce();
};
#endif

класс.cpp

#include <iostream>

using namespace std;

class Trida {
private:
 int a;

public:
 Trida(int n) {
  this->a = n;
 } 

 void fce() {
  cout << this->a << endl;
 }
};

Сообщение об ошибке:

gwynbleidd@gwynbleidd-pc:~/Skola/test$ make
g++ class.cpp -c
g++ main.cpp -c
g++ class.o main.o -o test.exe
main.o: In function `main':
main.cpp:(.text+0x26): undefined reference to `Trida::Trida(int)'
main.cpp:(.text+0x54): undefined reference to `Trida::fce()'
collect2: ld returned 1 exit status
make: *** [test] Error 1

Ответы [ 2 ]

4 голосов
/ 08 января 2011

Так вот, что вы сделали не так. В class.cpp вы воссоздаете новый класс Trida, а не реализуете тот, который вы создали в class.h. Ваш class.cpp должен выглядеть примерно так:

#include <iostream>
#include "class.h"

using namespace std;

Trida::Trida(int n)
{
  this->a = n;
}

void Trida::fce() { cout << this->a << endl; }

И действительно, вы должны использовать инициализацию, а не присваивание в конструкторе:

Trida::Trida(int n) : a(n) {}
0 голосов
/ 08 января 2011

Вы определяете класс trida два раза (в заголовочном файле class.h и в исходном файле class.cpp) Ваш файл class.cpp должен иметь вид

#include <iostream>
#include "class.h" //include "class.h"
using namespace std;

Trida::Trida(int n):a(n) //Initialization list
{
} 

void Trida::fce()
{
  cout << this->a << endl;
}
...