frage zu funktionen in strukturen
-
hallo,
habe folgendes problem, hoffe jemand hat ne idee:folgendes kleines beispiel:
mystruct.h
#include <iostream> using namespace std; typedef struct { int t_value; void t_sayHello; } T_MyStruct;mystruct.cpp
T_MyStruct::t_sayHello() { cout << "hello" << endl; }main.cpp
#include "myheader.h" int main( int argc, char *argv[]) { T_MyStruct ms; ms.t_sayHello(); return 0; }unter visual studio 2005 kann man obiges ohne fehlermeldungen kompilieren,
mit gcc compiler unter freeBSD gibt es ne linker-fehlermeldung. da muss man stattdessen den rumpf von t_sayHello mit in die strukturdeklaration packen oder aber den inhalt von mystruct.cpp in mystruct.h verlagern.weiss jemand wieso das so ist!?!?
danke.
-
kleiner zusatz:
der inhalt von mystruct.h:
#include <iostream> using namespace std; typedef struct { int t_value; void t_sayHello(); } T_MyStruct;
-
Linkst du denn die mystruct-Objektdatei mit?
-
typedef struct { int t_value; void t_sayHello(); // () fehlte } T_MyStruct; void T_MyStruct::t_sayHello() // Rückgabedatentyp fehlte { cout << "hello" << endl; }
-
@Dweb: thnx, fehlte in der tat.
die objekt datei tue ich mitlinken.
trotzdem meckert gcc.
-
uebrigens das kleine beispiel ist uebrigens ueberpruef-tauglich und die linker meldung ist eine
undefined reference linker meldung, sobald der rumpf in der cpp-datei steht.
-
Wie rufst du den gcc denn auf?
Klingt so als würdest du die eine .cpp Datei nicht mitkompilieren/linken.
-
pepe75 schrieb:
#include <iostream> using namespace std; typedef struct { int t_value; void t_sayHello; } T_MyStruct;Using-Direktiven haben in Header-Dateien nichts zu suchen. (!!!)
Da Du eh Dein struct mit einer Elementfunktion ausstatten willst, was ja in C gar nicht geht, kannst Du Dir auch das typedef sparen. Das ist in C++ überflüssig:
struct MyStruct { int value; void sayHello(); };kk
-
pepe75 schrieb:
#include <iostream> using namespace std; typedef struct { int t_value; void t_sayHello; } T_MyStruct;Using-Direktiven haben in Header-Dateien nichts zu suchen. (!!!)
Da Du eh Dein struct mit einer Elementfunktion ausstatten willst, was ja in C gar nicht geht, kannst Du Dir auch das typedef sparen. Das ist in C++ überflüssig:
struct MyStruct { int value; void sayHello(); };kk
-
dass using directiven ausserhalb von headern stehen muessen ist mir neu (grund?)
das mit dem typedef ruehrt daher, weil der original-code ein misch-masch aus altem C und neuem C++ ist und ich das kleine beispiel hier danach gerichtet habe.
trotzdem keine idee wegen des linker-fehlers?
gruss
-
ok, das mit dem hinweis wegen der using directiven leuchtet jetzt ein -> durch das includieren des headers ist die using directive ja dann auch fuer die includierenden stellen eingefuegt, was man vielleicht nicht moechte (namensraumkonflikte etc.)
-
pepe75 schrieb:
trotzdem keine idee wegen des linker-fehlers?
Ja: Du hast bestimmt irgendwas falsch gemacht. :p
Poste nochmal ne detaillierte Beschreibung von dem, was Du eigentlich machst -- inklusive Compiler/Linker-Aufruf und der Fehlermeldung.
kk