[ANFÄNGER] Funktion aus verschiedenen Klassen



  • Hallo,

    ich bin neu hier und ich versuche mich gerade an C++.
    Ich bin jetzt an einem Punkt an dem ich nicht mehr weiter weiß,

    /*main.cpp*/
    
    #include <iostream>
    
    using namespace std;
    
    int add(int, int);
    
    int main()
    {
        cout << "Klasse *main.cpp*" << endl;
        cout << add(5, 5) << endl;
        return 0;
    }
    
    int add(int a, int b)
    {
        return a + b + 10;
    }
    
    /*test.cpp*/
    
    #include <iostream>
    
    int add(int a, int b)
    {
        return a + b;
    }
    

    Das ist mein Programm (besteht aus main.cpp u. test.cpp) wie kann ich dem Compiler jetzt sagen welche Funktion "add" er benutzen soll es gibt ja zwei einmal die aus der test.cpp und einmal die in der main.cpp oder ist sowas nicht möglich in C++ ?

    MFG


  • Mod

    Sofern du die nicht in unterschiedliche Namespaces packst, ist das nicht möglich, da die Funktionsparameter jeweils vom gleichen Typ sind. Wären sie unterschiedlich, würde die zum Funktionsaufruf passende Funktion gewählt. Das Programm ist in diesem Zustand ungültig, da es zwei widersprechende Definitionen der gleichen Funktion gibt.



  • Übrigens hat das Ganze mit Klassen nichts zu tun, main.cpp ist keine Klasse!



  • manni66 schrieb:

    Übrigens hat das Ganze mit Klassen nichts zu tun, main.cpp ist keine Klasse!

    Wenn du aus der Java-Sparte kommste: Hier in C++ gibt es keine Abbildung von Klassen auf Dateien wie in Java. Hier herrscht Anarchie 😃 !



  • test.cpp ist völlig nutzlos, da du keinen Header zur Verfügung stellst der die Funktion deklariert und anschließend in main.cpp eingebunden werden kann.
    Folgend musst du folgendes tun:

    • Eine Datei test.hxx erstellen, und Zeile 7 (also die Deklaration von add) dort hineinkopieren. Include-Guards nicht vergessen.
    • In der main.cpp direkt unter #include <iostream> #include "test.hxx" einfügen.
    • Die Definition von add in der main.cpp (hinter der main()) löschen.

    Am Ende sieht das ganze dann so aus:

    main.cpp:

    #include <iostream>
    #include "test.hxx"
    
    int main()
    {
        std::cout << "Klasse *main.cpp*" << '\n';
        std::cout << add(5, 5) << '\n';
    }//Die main()-Funktion gibt in C++ automatisch 0 zurück, wenn nichts anderes zurückgegeben wird
    

    test.hxx:

    #ifndef _Test_hxx_
    #define _Test_hxx_
    
    int add(int, int);
    
    #endif//_Test_hxx_
    

    test.cpp:

    #include "test.hxx"
    
    int add(int a, int b)
    {
        return a + b;
    }
    

    Du kannst, wenn du willst, auch die Funktion gleich im Header definieren (hier brauchst du dann auch nicht inlinen).
    Kannst auch als Übung 'ne Template-Funktion daraus machen 😉



  • Hacker schrieb:

    test.cpp ist völlig nutzlos, da du keinen Header zur Verfügung stellst der die Funktion deklariert und anschließend in main.cpp eingebunden werden kann.

    Er braucht keinen Header, weil er in der main.cpp eine Deklaration von add hat.

    wie kann ich dem Compiler jetzt sagen welche Funktion "add" er benutzen soll es gibt ja zwei einmal die aus der test.cpp und einmal die in der main.cpp oder ist sowas nicht möglich in C++ ?

    So in der Form ist das nicht möglich. Du könntest aber die add aus der main.cpp herausnehmen und in eine anderen Übersetzungseinheit schieben, und dann den Linker entweder anweisen, die eine oder die andere Objektdatei einzubinden. Wie das geht ist natürlich compilerspezifisch, und wie man das am geschicktesten anstellt, weiß ich auch nicht. Musst ein bisschen mit make rumpfriemeln.



  • Bashar schrieb:

    Hacker schrieb:

    test.cpp ist völlig nutzlos, da du keinen Header zur Verfügung stellst der die Funktion deklariert und anschließend in main.cpp eingebunden werden kann.

    Er braucht keinen Header, weil er in der main.cpp eine Deklaration von add hat.

    Ja, hast Recht - aber es ist trotzdem schöner das in einen Header zu packen. Gerade dann wenn er vielleicht irgendwann mal die Funktion in verschiedenen Übersetzungseinheiten nutzen will.



  • ThePixel5D schrieb:

    ich bin neu hier und ich versuche mich gerade an C++.
    Ich bin jetzt an einem Punkt an dem ich nicht mehr weiter weiß,

    /*main.cpp*/
    
    #include <iostream>
    
    using namespace std;
    
    int add(int, int);
    
    int main()
    {
        cout << "Klasse *main.cpp*" << endl;
        cout << add(5, 5) << endl;
        return 0;
    }
    
    int add(int a, int b)
    {
        return a + b + 10;
    }
    
    /*test.cpp*/
    
    #include <iostream>
    
    int add(int a, int b)
    {
        return a + b;
    }
    

    Das ist mein Programm (besteht aus main.cpp u. test.cpp) wie kann ich dem Compiler jetzt sagen welche Funktion "add" er benutzen soll es gibt ja zwei einmal die aus der test.cpp und einmal die in der main.cpp oder ist sowas nicht möglich in C++?

    Wenn du beide Dateien kompilierst und linken willst, wird der Linker das mit einer Fehlermeldung quittieren; denn du verletzt hier die "one definition rule" auf eine Art, die vom Linker leicht festzustellen ist.

    Schau in deinem C++ Buch folgende Dinge nach:
    - internal vs. external Linkage (deutsch: interne/externe Bindung)
    - ODR, one definition rule (deutsch: "Eine-Definition-Regel"?)
    - das Konzept der "getrennten Übersetzung"

    Kurz gesagt: In einem Programm darf eine bestimmte Funktion nur einmal definiert werden (ausgenommen inline-Funktionen und Funktionstemplates). Hier hast du ::add vom Typ int(int,int) zweimal definiert.

    Möchtest du etwas bestimmtes erreichen?



  • krümelkacker schrieb:

    Möchtest du etwas bestimmtes erreichen?

    Ich hätte auf Stub-Funktionen zum Testen getippt. Man tauscht zur Linkzeit die Implementationen bestimmter Funktionen aus, die von der zu testenden Funktion benutzt werden. Vielleicht hab ich mich vom Namen "test.cpp" täuschen lassen, auf den zweiten Blick bin ich mir da gar nicht mehr so sicher...


Log in to reply