Klassenvererbung



  • Hi everyone

    Folgendes Problem: in meinem Programm gibt's momentan drei Klassen: "CMeter", "CIEC1107" und "CZMD120". Dem Konstruktor von Meter kann eine Addresse mitgegeben werden, welche das Gerät eindeutig identifiziert.

    Nun ist es so, dass CIEC1107 ein CMeter-Gerät ist und CZMD120 ein CIEC1107-Gerät (mehrfache Vererbung). Ich habe den Konstruktor von CIEC1107 so aufbereiet, dass CMeter's Konstruktor aufrfut, und CZMD120's Konstruktor ruft CIEC1107's Konstruktor auf (welcher dann ja wieder CMeter's Konstruktor aufrufen sollte 🙂 ).

    Das sieht dann etwa so aus:

    ...
    CMeter::CMeter(char *m_strAddress) {
    ...
    CIEC1107::CIEC1107(char *m_strAddress): CMeter(m_strAddress) {
    ...
    CZMD120::CZMD120(char *m_strAddress): CIEC1107(m_strAddress) {
    ...
    

    So sollte ich also ein CZMD120-Gerät mitsamt Addresse instantiieren können. Leider klappt es nur bis zur CIE1107-Ebene, also über eine Vererbung hinweg. Ab der 2. Vererbung lässt sich das Programm zwar noch kompilieren, stürzt aber bei einer Instanziierung eines solchen Objekts mit diesem Konstruktor sogleich ab.

    Woran kann das liegen?

    Danke für eure Hilfe und Gruss
    Kessi



  • Hallo

    Weder dein Codeauszug noch deine Fehlerbeschreibung reichen für eine Beurteilung von uns hier aus. Das was du gezeigt hast ist jedenfalls syntaktisch richtig, davon kommt kein Laufzeitfehler.

    Du must deinen Debugger benutzten und der Verlauf bis zum Absturz verfolgen.

    bis bald
    akari



  • akari schrieb:

    Das was du gezeigt hast ist jedenfalls syntaktisch richtig, davon kommt kein Laufzeitfehler.

    Na, das ist ja schon mal was 🙂

    Mein Problem ist allerdings, dass ich keinen Debugger habe. Es ist eine Cross-Plattform Entwicklung für eine XScale Umgebung. Ich bin schon froh, dass meine IDE überhaupt mit dem Compiler klar kommt 😛

    Ich muss die Software also stets auf dem Ziel-System laufen lassen, welches leider bei jeder Form von Fehler (und zwar wirklich bei *jeder*) einfach nur folgende Zeilen ausgibt:

    Segmentation Fault
    

    Um also, wie akari vorschlägt, meinem ganzem Code die Ehre zu geben:

    #include <string.h>
    #include <stdio.h>
    
    // Basis-Klasse
    class CEwbMeter {
          private:
          char strAddress[32];
          public:
          CEwbMeter(void);
          CEwbMeter(char *);
          void set_strAddress(char *);
          char *get_strAddress();
    };
    CEwbMeter::CEwbMeter() {
         (*this).set_strAddress("");
    }
    CEwbMeter::CEwbMeter(char *m_strAddress) {
         (*this).set_strAddress(m_strAddress);
    }
    void CEwbMeter::set_strAddress(char *m_strAddress) {
         strcpy(strAddress, m_strAddress);
    }
    char *CEwbMeter::get_strAddress() {
        return strAddress;
    }
    
    // Unter-Klasse
    class CIEC1107: public CEwbMeter {
          private:
          char *strDevRep;
          void set_strDevRep(char *);
          public:
          CIEC1107(void);
          CIEC1107(char *);
          void ReadIn(void);
          char *get_strDevRep(void);
    };
    CIEC1107::CIEC1107(void): CEwbMeter() {
         (*this).set_strDevRep("");
    }
    CIEC1107::CIEC1107(char *m_strAddress): CEwbMeter(m_strAddress) {
         (*this).set_strDevRep("");
    }
    void CIEC1107::ReadIn(void) {
    
    }
    char *CIEC1107::get_strDevRep() {
         return strDevRep;
    }
    void CIEC1107::set_strDevRep(char *m_strDevRep) {
         strcpy(strDevRep, m_strDevRep);
    }
    
    // Unter-Unter-Klasse
    class CZMD120: public CIEC1107 {
          private:
          char *strDataString;
          void set_strDataString(char *);
          public:
          CZMD120(void);
          CZMD120(char *);
          void mk_strDataString(void);
          char *get_strDataString(void);
    };
    CZMD120::CZMD120(void): CIEC1107() {
         (*this).set_strDataString("");
    }
    CZMD120::CZMD120(char *m_strAddress): CIEC1107(m_strAddress) {
         (*this).set_strDataString("");
    }
    void CZMD120::mk_strDataString() {
    
    }
    char *CZMD120::get_strDataString() {
         return strDataString;
    }
    void CZMD120::set_strDataString(char *m_strDataString) {
         strcpy(strDataString, m_strDataString);
    }
    
    int main(void) {
        /*CIEC1107 iecTest("34982215");
        printf("strAddress: %s;", iecTest.get_strAddress());*/
        // Funktioniert
    
        CZMD120 zmdTest("34982215");
        printf("strAddress: %s;", zmdTest.get_strAddress());
        // Segmentation Fault
    }
    

    Thx again und greeetz
    Kessei



  • Okeee... Hat sich gerade erledigt 🙂

    Der Fehler war folgender: Meine Char Arrays strDevRep und strDataString wurden nie mit malloc() initialisiert. Beim Verwenden selbiger musste natürlich ein Zugriffsfehler auftreten.

    Pointer sind eine Erfindung Satans 🤡 !

    greeetz Kessi



  • KessiMC schrieb:

    Nun ist es so, dass CIEC1107 ein CMeter-Gerät ist und CZMD120 ein CIEC1107-Gerät (mehrfache Vererbung).

    Nur um das mal zu klären: Das hat nichts mit Mehrfachvererbung zu tun! 🙂

    KessiMC schrieb:

    Der Fehler war folgender: Meine Char Arrays strDevRep und strDataString wurden nie mit malloc() initialisiert. Beim Verwenden selbiger musste natürlich ein Zugriffsfehler auftreten.

    Pointer sind eine Erfindung Satans 🤡 !

    Jaja, alles auf die Pointer schieben! Das Problem liegt doch immer am Programmierer! 😛
    Um sowas zu vermeiden wäre es in C++ übrigens angebracht Strings zu verwenden (std::string).

    grüße



  • Stiiimmt 💡 Mehrfachvererbung wäre ja, wenn eine Klasse 2 verschiedene Basisklassen hätte. Aber wie nennt man dann das hier 😕 ?



  • Einfachvererbung z.B.? 😉



  • pwnd :p

    Na schön, terminologisch macht unsere wunderbare Sprache also keinen Unterschied zwischen einer Klasse, die von einer Basisklasse abstammt und einer Klasse, welche von einer Klasse abstammt, welche selbst wiederum von einer Basisklasse abstammt?



  • KessiMC schrieb:

    pwnd :p

    Na schön, terminologisch macht unsere wunderbare Sprache also keinen Unterschied zwischen einer Klasse, die von einer Basisklasse abstammt und einer Klasse, welche von einer Klasse abstammt, welche selbst wiederum von einer Basisklasse abstammt?

    Naja, es ist ja auch kein Unterschied 😉

    Gruß,

    Simon2.


Log in to reply