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


Anmelden zum Antworten