Undefinierter Bezug während einschließlich Header in C ++
-
08-10-2019 - |
Frage
Ich arbeitete an meinem Projekt, während ich beschlossen, dass ich es in Dateien aufgeteilt werden soll. Allerdings habe ich mit Problem wie dieses und alle Ratschläge stucked ich über Google gefunden wurden über das Vergessen beide Objektdateien zu verknüpfen, die ich recht tue (zumindest glaube ich so).
Makefile:
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
class.cpp
#include <iostream>
using namespace std;
class Trida {
private:
int a;
public:
Trida(int n) {
this->a = n;
}
void fce() {
cout << this->a << endl;
}
};
Fehlermeldung:
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
Lösung
Also hier ist, was Sie falsch gemacht haben. In class.cpp Sie erstellen ein neue Trida Klasse anstatt implementieren das Sie in class.h erstellt haben. Ihre class.cpp sollte wie folgt aussehen:
#include <iostream>
#include "class.h"
using namespace std;
Trida::Trida(int n)
{
this->a = n;
}
void Trida::fce() { cout << this->a << endl; }
Und eigentlich sollte man eher mit der Initialisierung werden als Zuweisung in Ihrem Konstruktor:
Trida::Trida(int n) : a(n) {}
Andere Tipps
Sie definieren Klasse trida
zweimal (in der Header-Datei class.h
und in der Quelldatei class.cpp
)
Ihre class.cpp Datei sollte sein
#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;
}