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
War es hilfreich?

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top