Frage zur Vererbung



  • Sollte man eine Klasse immer zusammen mit ihrer implementierung in eine Header Datei schreiben? (oder die Implementierung in den Source verlagern?) weil, wenn man sie als Basisklasse benutzen will, muss man sonst schließlich alle Methoden neu implementieren.



  • skullyan schrieb:

    weil, wenn man sie als Basisklasse benutzen will, muss man sonst schließlich alle Methoden neu implementieren.

    Nö muss man echt nicht.... Wie kommst du darauf?
    Das einzigste was im Header stehen muss, ist die implementierung eines templates.



  • Das mache ich nicht einheitlich. Template-Sachen stehen eh im Header. Im Header lasse ich auch triviale Sachen, Einzeiler und so. Außerdem fangen bei mir die allermeisten Methoden im Header an und wandern erst nach ein oder zwei Wochen aus.



  • Orakel-Joe schrieb:

    skullyan schrieb:

    weil, wenn man sie als Basisklasse benutzen will, muss man sonst schließlich alle Methoden neu implementieren.

    Nö muss man echt nicht.... Wie kommst du darauf?[...]

    Dachte ich, weil ich ja bei der abgeleiteten Klasse nur den Header inklude. Und wenn die Implementierungen dann im Source stehen, hat man doch keinen Zugriff darauf. Oder hab ich etwas verpasst?



  • Wieso? Wenn du nicht ableitest, sondern eine Klasse/Funktion/... nur benutzt, reicht doch auch ein include, und trotzdem wird die Implementierung aus dem *.cpp gefunden und verwendet.



  • volkard schrieb:

    Im Header lasse ich auch triviale Sachen, Einzeiler und so. Außerdem fangen bei mir die allermeisten Methoden im Header an und wandern erst nach ein oder zwei Wochen aus.

    Und dann wird jedesmal die ganze Welt neu gebaut, wenn irgendwann[TM] aus dem Einzeiler ein Zehnzeiler wird und du die Methode umziehst? Bei kleineren Projekten und/oder Randkomponenten die nicht viel genutzt werden mag das gehen, aber bei größeren Projekten kann das tödlich werden.



  • skullyan schrieb:

    Orakel-Joe schrieb:

    skullyan schrieb:

    weil, wenn man sie als Basisklasse benutzen will, muss man sonst schließlich alle Methoden neu implementieren.

    Nö muss man echt nicht.... Wie kommst du darauf?[...]

    Dachte ich, weil ich ja bei der abgeleiteten Klasse nur den Header inklude. Und wenn die Implementierungen dann im Source stehen, hat man doch keinen Zugriff darauf. Oder hab ich etwas verpasst?

    Offensichtlich hast Du etwas verpasst. Die Source, in der die Implementierung für Deine Klasse steht, muß kompiliert werden, und die resultierende Objektdatei muß Deiner Anwendung hinzugelinkt werden.



  • Belli schrieb:

    skullyan schrieb:

    Orakel-Joe schrieb:

    skullyan schrieb:

    weil, wenn man sie als Basisklasse benutzen will, muss man sonst schließlich alle Methoden neu implementieren.

    Nö muss man echt nicht.... Wie kommst du darauf?[...]

    Dachte ich, weil ich ja bei der abgeleiteten Klasse nur den Header inklude. Und wenn die Implementierungen dann im Source stehen, hat man doch keinen Zugriff darauf. Oder hab ich etwas verpasst?

    Offensichtlich hast Du etwas verpasst. Die Source, in der die Implementierung für Deine Klasse steht, muß kompiliert werden, und die resultierende Objektdatei muß Deiner Anwendung hinzugelinkt werden.

    Habe ich mir gedacht.. Wenn aber in beiden Dateien je eine main() Funktion definiert ist, sagt der Compiler natürlich, das Sie nicht überladen werden darf. D.h. man muss in die Source NUR die Implementierungen reinschreiben? Wie sieht so eine Source aus? Kannst Du mir mal ein Beispiel geben?

    Danke.



  • /* func.h /*
    
    int addiere(int a, int b);
    
    /* func.cpp */
    #include "func.h"
    
    int addiere(int a, int b)
    {
       return a + b;
    }
    
    /* main.cpp */
    #include <iostream>
    #include "func.h"
    
    int main()
    {
        std::cout << addiere(3, 5) << std::endl;
    }
    


  • Belli schrieb:

    /* func.h /*
    
    int addiere(int a, int b);
    
    /* func.cpp */
    #include "func.h"
    
    int addiere(int a, int b)
    {
       return a + b;
    }
    
    /* main.cpp */
    #include <iostream>
    #include "func.h"
    
    int main()
    {
        std::cout << addiere(3, 5) << std::endl;
    }
    

    Hey, simpler als erwartet. Danke!


Anmelden zum Antworten