Klassenmethoden extern binden



  • Hallo,

    ich suche eine Möglichkeit Klassenmethoden zu exportieren,
    c++ macht leider einen Unterschied ob eine Methode im Scope einer Klasse definiert wird oder nachträglich mit via dem Operator ::

    Ich suche etwas wie:

    class Hallo {
    public:
    extern print() { ...} //Print soll auch in anderen Übersetzungseinheiten sichtbar sein, "extern" klappt hier leider nicht
    };
    
    Hallo::print() {...} // Das klappt, will ich aber nicht
    

    Ziel ist, dass der C++ Code mehr so aussieht wie Java, ich möchte meine Klassen nicht zerpflücken und über Header und cpp Dateien verteilen.

    Ich hab schon bei Google geschaut und der Bjarne konnte mir auch nicht helfen 😉
    viele Grüsse und Dank,
    metachris



  • Ich verstehe nicht, was du eigentlich willst. Hallo::print() kann natürlich nicht funktionieren, weil du für den Aufruf von print ein Objekt brauchst. Damit du Hallo::print() schreiben kannst, muss print static sein, also

    class Hallo
    {
    public: static void print();
    };
    

    metachris_ schrieb:

    c++ macht leider einen Unterschied ob eine Methode im Scope einer Klasse definiert wird oder nachträglich mit via dem Operator ::

    Vielleicht willst du deine Methoden inline definieren?!

    Wie gesagt, ich verstehe dein Problem nicht 🙄 . Wenn etwas in anderen Übersetzungseinheiten sichtbar sein soll, warum nicht einfach include benutzen?



  • Hi,

    sorry vielleicht habe ich das nicht klar genug beschrieben 😉

    Und sicher, natürlich braucht man ein Objekt 🙂

    Die Lösung mit Include funktioniert, nur hat man dann sein ganzes Projekt in .h Dateien stehen und in einer main.cpp. Der Nachtteil dabei ist, dass man das Projekt nur als ganzes übersetzen kann, nicht aber die einzelnen Module. Was je nach Projekt lang und länger dauert.

    Mir geht es um die getrennte Übersetzung, und im Fall

    class Hello {
    void print() {}
    };

    wird die Methode print nicht exportiert, sie taucht nicht in der zugehörigen .o Datei auf.
    Definiert man print mit

    void Hello::print() {}

    wird die Funktion sehr wohl exportiert, weil sie dann eine Art globale Variable, die meines Wissens nach immer exportiert werden in einem Namensraum ist. Ich verstehe das auch noch nicht ganz, vielleicht kennt sich damit ja jemand aus. Auf jeden Fall taucht Hello::print() bei der zweiten Art der Definition in der .o Datei auf, und es kann aus anderen Modulen darauf zugegriffen werden, bei der ersten Defintion gibt es Linkerfehler.

    Ich empfinde die erste Art der Defintion als schöner und übersichtlicher, da muss man nicht jedesmal in den Header schauen um einen Blick auf die Variablendefinitionen zu werden.

    viele Grüsse,
    metachris



  • weil wenn du z.b.
    diese dateien hasch:
    class.h
    class.cpp
    a.cpp
    main.cpp

    a und main.cpp includen bede class.h.....
    wen dort nur die deklaration steht dann is alles okay.....
    wenn dort aber die deinition steht dann kriegst du linker problem wegen mehrfachdeklaration....
    und wenn methoden in einer klasse definiert werden sind sie inline.....
    aber wenn sie zu gross sind ignoriert ein kompiler das implizite inline und du kriegts kinker probleme...
    deswegen nur für set/get methoden dei definition in der klasse okay.......ansonsten gibbbets nur probleme....


Log in to reply