Problem mit der String-Klasse

Davicito

Erfahrenes Mitglied
Hallo,
ich habe folgendes Problem. Ich möchte einem Konstruktor der Klasse "Test" einen String und die Stringlänge übergeben. Dabei taucht folgende Fehlermeldung auf:

Code:
/tmp/ccesA4D3.o: In function `main':
/home/izaguirre/C++/Test/App.cpp:22: undefined reference to `Test::Test(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)'
collect2: ld gab 1 als Ende-Status zurück

ich kann damit nicht viel anfangen. Vielleicht kennt einer von Euch was damit gemeint ist.
Vielen Dank im Voraus.

App.cpp
Java:
#include <string>
using namespace std ;

int main(int argc, char* argv[])
{
         string str(argv[1]);
		Test* moor = new Test(argv[1], str.length());

}

Test.cpp
Java:
#include <string>
#include "Test.hpp"

using namespace std ;

Test::Test(string datei, int laenge):dateiname(datei), dateilaenge(laenge)
{

}

void Test::print(){

}

Test.hpp
Java:
...
class Test
{
	private:
	int dateilaenge;	
	string dateiname;

	public:
	Test(string datei, int laenge) ;
	void print();
} ;
 
Die Funktion Test::Test() ist in main() unbekannt (nicht definiert), weil Test.cpp in App.cpp nicht included ist.
 
Hallo Thomasio,
vielen lieben Dank. Es funktioniert auch sehr gut. Aber was ich dabei nicht verstehe ist, wieso ich, wenn ich den Header von Test.cpp includiert habe, ich dann noch Test.cpp in der App.cpp includieren muss.
In C mache ich das doch genau so ohne das ich *.c in dem Hauptprogramm includiren muss.

Ich habe ne bildungslücke! Hilfe!
 
naja.. es hat jedenfalls funktioniert.. komischerweise. Wenn ich die #include <Test.cpp> raus nehme, kommt die Fehlermeldung wieder.

Und ich verstehe das nicht. Hab ja die Test.hpp includiert.
 
In der App.cpp?

...Schreib in der h mal immer std::string statt string.

Und im main str statt argv[1] übergeben.
 
Hi.

Zuerstmal zum Fehler:

Der Fehler ist ein Linker-Fehler. Das Ganze hat also weder etwas mit Namensräumen, noch mit include's zu tun.

Du hast offenbar vergessen die Test.obj Datei zu deinem Projekt zu linken. (Klar, dass es funktioniert wenn du die Test.cpp includest...)

Welchen Compiler benutzt du? Welche Entwicklungsumgebung? Hast du ein Projekt angelegt? Hast du alle Dateien zu dem Projekt hinzugefügt?

\edit: Ein std::string speichert immer auch die Länge des Strings, du brauchst also nicht die Länge nochmal extra im Konstruktor übergeben.

Und es wäre besser den String als konstante Referenz zu übergeben:
C++:
Test(const std::string& dateiname);
Gruß
 
Zuletzt bearbeitet:
Hallo deepthroat,

Ich programmiere das ganze unter dem Terminal in Ubuntu und verwende den gcc-Compiler. Also es ist projektlos, die Programmdatein sind mittels Editor erstellt und liegen in einem gemeinsamen Ordner. Durch ein Makefile, kompeliere ich die Anwendung zu einem ausführbaren Programm. So habe ich bisher in C Programmiert. Und in der Uni machen wir das genau so in C++. Nur mit der Fehlermeldung, konnte ich nichts anfangen.

Was meinst Du mit Test.opj? Die habe ich leider nicht.

Das mit der Länge, des Strings, wusste ich nicht. Aber genial, wenn die Klasse String das gleich für mich macht.

Hast Du noch eine Idee, wie ich das sonst noch, ohne das ich Test.cpp in die App.cpp includieren muss, lösen kann?

Liebe Grüße.
 
Wenn du mehrere .cpp Dateien hast, erzeugst du daraus auch mehrere .obj Dateien oder .o Dateien unter *nix. Diese mußt du dann zusammenlinken:
Bash:
gcc -Wall -c Test.cpp # erzeugt Test.o
gcc -Wall -c App.cpp # erzeugt App.o
gcc App.o Test.o -o App
Das Makefile zur Erzeugung der Executable sollte dementsprechend so aussehen:
Code:
App: Test.o App.o
  $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
Gruß
 
ja ja das ist schon alles im Make drinn. Schau:

C:
CC=c++
FLAGS=-Wall -g

OBJECTS=Test.o

token : App.cpp $(OBJECTS)
	$(CC) $(FLAGS) -o token App.cpp $(OBJECTS)

Knoten.o : Test.cpp Test.hpp
	$(CC) $(FLAGS) -c Test.cpp


clean:
	rm token $(OBJECTS)

aber darann hatt es nicht gelegen.
 
Zurück