VS2012 / MFC/C++: Methodenimplementierung



  • Hallo,

    ich hab ein Problem mit einer MFC-App, ist aber vielleicht auch VS2012-spezifisch.

    Folgendes: ich habe zwei LIBs, Lib-A und Lib-B und nutze beide in meinem Projekt (.EXE).

    Lib-A (.lib) hat eine Klasse ungefähr:

    class A {
                   int i;
                   void setI(int val) {i = val;}
                ....
    

    In der Lib ist ein statisches Objekt der Klasse A instanziiert.

    Lib-B (.lib) nutzt class A , z.B. die Methode setI() (includiert die H-File der Lib-A)

    Wenn ich jetzt in Lib-A die Methode setI() aus der Klassendefinition in die Implementierungsdatei nehme, also

    class A {
                   int i;
                   void setI(int val);
                ....
    

    die LIB-B aber *nicht* neu erstelle, kriege ich beim Linken meines Gesamtprojektes Linker-Fehler, der meckert, die Methode A::setI() sei bereits in Lib-B definiert.

    Frage:
    - der Compiler macht aus der ersten Variante irgendwie eine Art inLine-Methode? 100% InLine kann es ja aber auch nicht sein, denn dann hätte ich ja keine Linker-Fehler, oder?
    😕



  • Hab jetzt mal ein bisschen rumexperimentiert und mir bei einem Testprojekt die MAP erzeugen lassen. Hier eine Zeile mit der fraglichen Methode

    0002:0000e920 ?setI@A@@QAEXH@Z 0041f920 f i B:B.obj

    Kann mir bitte jemand erklären, was "f i B:B.obj" bedeutet?



  • Benutzt du eigentlich dynamische oder statische Libs?

    Verstehe ich das richtig, daß du die Implementierung der setI-Methode aus dem Header in die Sourcedatei (von Lib-A) verschoben hast und jetzt nur Lib-A neu erstellt hast (ohne Lib-B) und jetzt erwartest, daß das jetzt noch zusammen funktionieren soll?



  • @Th69: ja, es sind statische LIBs (.lib).

    Und ein 2.Mal ja: hätte gedacht, dass ich LibB nicht neu übersetzen muss, also, dass der Code in der class A ist, egal ob setI() in der Klassendefinition oder der Implementierungsdatei steht.

    Offenbar ist das nicht der Fall, aber warum gibt es da einen Unterschied?



  • Wenn der Code in der Klasse definiert ist, dann liegt dieser eben nicht in der statischen Lib sondern er wird eben im Zielmodul direkt mit einkompiliert.

    Getter und Setter sind entsprechend schnell. Der Compiler kennt ja den Code. Warum soll er eine Lib benutzen.



  • @Martin, OK, Danke.

    ('Echter' InLine-Code ist es dann ja wohl aber nicht, denn sonst würde der Linker ja nicht meckern)

    Grüße!!