Klassen Vererbung



  • Ist es möglich zwei Klassen in eine zu vererben.

    Grundgedanke:
    class Klasse1 : public Klasse2 : public Klass3

    Grund dafür ist, das ich gerne ein Objekt in aus Klasse1 in Klasse2 Deklarieren möchte. Dabei leider immer der Fehler kommt fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

    Außer ich verrebe die Klasse

    Beispiel
    class Klasse1 : public Klasse3
    {
    public:
    Klasse2 objekt;
    };
    lg



  • Bitte die ganze, exakte Fehlermeldung posten.
    Edit:
    Und auch genau der Source Code bei dem es auftritt (möglichst ein kurzes bsp.)



  • juri23 schrieb:

    Ist es möglich zwei Klassen in eine zu vererben.

    Ja, nennt sich Mehrfachvererbung (multiple inheritance). Schreibt sich

    class Klasse1 : public Klasse2, public Klasse 3
    {
    
     /* ... */ 
    };
    

    Grund dafür ist, das ich gerne ein Objekt in aus Klasse1 in Klasse2 Deklarieren möchte.

    Das ist der falsche Grund. Wenn du Vererbung nicht zwingend brauchst, solltest du sie auch nicht verwenden. Du scheinst hier Komposition zu wollen, das ist nicht Vererbung.

    Dabei leider immer der Fehler kommt fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

    Eine komplette Fehlermeldung wäre hier hilfreich - und der relevante Code. Vererbung zu bemühen, nur weil du Komposition nicht hinbekommst, ist auf jeden Fall der falsche Weg.

    Lies dir bitte auch den Link in meiner Signatur durch, bzgl. Aussagekräftiger Fehlermeldung, reduziertem, aber vollständigem Code und cpp-Tags.



  • Moeglich ist das.
    Was du vermeiden solltest sind dinge wo klasse 2 und klasse 3 von einer gemeinsamen Klasse abgeleitet wurden. Siehe diamond of death http://en.wikipedia.org/wiki/Diamond_problem
    Obwohl auch das moeglich ist birgt es viele Fallstricke.

    Gruss,
    muli



  • @muli, pumuckl, theta
    Danke für die schnelle Antwort, ich werde meine Frage prozessieren.
    Möchte das Beispiel aus dem Buch „Qt 4 Gui-Entwicklung mit C++“ auf Seite 560 ausprobieren und verstehen. Sitze schon seit mehreren Tagen dran.

    openneu.h

    #ifndef OPENNEU_H
    #define OPENNEU_H
    
    #include <QtGui/QMainWindow>
    #include "ui_openneu.h"
    #include "thread.h"
    
    class openneu : public QMainWindow
    {
        Q_OBJECT
    public:
        openneu(QWidget *parent = 0, Qt::WFlags flags = 0);
        ~openneu();
    
    private:
        Thread thread1;
        Ui::openneuClass ui;
    };
    #endif // OPENNEU_H
    

    thread.h

    #ifndef THREAD_H
    #define THREAD_H
    #include <QThread>
    
    class Thread : public QThread {
       Q_OBJECT
    public:
       Thread();
    protected:
       void run();
    private:   
    };
    #endif
    

    Der Fehler:

    : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Thread::Thread(void)" (??0Thread@@QAE@XZ)" in Funktion ""public: __thiscall openneu::openneu(class QWidget *,class QFlags<enum Qt::WindowType>)" (??0openneu@@QAE@PAVQWidget@@V?$QFlags@W4WindowType@Qt@@@@@Z)".
    fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

    Deswegen bin ich davon ausgegangen das die Klasse openneu die Klasse Thread nicht sieht.

    mfg



  • juri23 schrieb:

    Deswegen bin ich davon ausgegangen das die Klasse openneu die Klasse Thread nicht sieht.

    Klassen haben keine Augen 😉 Sehen können sie daher nichts.
    Was du da hast, ist eine Fehlermeldung vom Linker. Der Compiler hat den ganzen Code aus den einzelnen .cpp's übersetzen können, und im Konstruktor von openneu steht (explizit oder implizit) der Aufruf für den Default-Ctor von Thread. Allerdings sucht der Linker vergeblich nach der Objektdatei, die den Code für Thread::Thread enthält. Das kann zwei ursachen haben:

    1. Du hast die Definition vergessen
    2. Du hast dem Linker nicht die Objektdatei mitgeliefert, in der die Definition liegt (bzw. in deiner IDE die passende .cpp nicht dem Projekt hinzugefügt)

    Ich hoffe, das hilft weiter. Welche der beiden Möglichkeiten die richtige ist, weiß ich nicht, da du uns deine .cpp's nicht zeigst.



  • Die genannten Funktionen sind vermutlich einfach nicht definiert (implementiert) im Source (cpp) File.

    Simon



  • @pumuckl

    Entschuldige bitte. Ich habe schon alles mit den Include files versucht, habe es versucht genau so wie im Buch zu machen. Bin sehr verwundert das es nicht geht. lg

    main.cpp

    #include <QtGui/QApplication>
    #include "openneu.h"
    
    int main(int argc, char *argv[])
    {
    	QApplication a(argc, argv);
    	openneu w;
    	w.show();
    	return a.exec();
    }
    

    openneu.cpp

    #include <QtGui>
    #include "openneu.h"
    #include "thread.h"
    
    openneu::openneu(QWidget *parent, Qt::WFlags flags)
        : QMainWindow(parent, flags)
    {
        ui.setupUi(this);
    
    }
    
    openneu::~openneu()
    {
    
    }
    

    thread.cpp

    #include "thread.h"
    
    Thread::Thread() {
    	int i=0;
    
    }
    
    void Thread::run() {
    	//Hier findet die eigentliche Arbeit statt 
    }
    


  • Irgendwie passt das alles nicht zusammen, was du uns da postest. Du rufst in deine main() openneu::show() auf, die Funktion hast du uns noch garnicht gezeigt.

    Davon abgesehen: Mit #includes hat das nichts zu tun, die sind alle in Ordnung, sonst würde der Compiler meckern. Offenbar fehlt deinem Linker die thread.o bzw. thread.obj. Thread::Thread() ist in der thread.cpp, sollte also in der thread.obj vorliegen.
    Schau mal im Buch deiner Wahl das Kapitel zum Thema "mehrere Übersetzugnseinheiten" (oder mehrere Module, Sourcecode-Aufteilung etc.) an und mache dich kundig, wie man bei deinem Compiler bzw. deiner IDE mit mehreren Übersetzungseinheiten arbeitet.



  • Vielen dank habe deinen Ratschlag beherzigt und es startet nun 😋
    Du weißt nicht vielleicht was es mit der

    ui::openneu ui
    

    auf sich hat. Anscheinend wird das erzeugt damit ich auf die vom qt designer erzeugen .ui datei zugreifen kann. Aber kann ich das auch in die Thread Klasse einbinden ?
    Damit ich mit

    run()
    

    auch ein

    labelText()
    

    öffnen kann ?



  • juri23 schrieb:

    Du weißt nicht vielleicht was es mit der

    ui::openneu ui
    

    auf sich hat.

    Nein, das dürfte dann was sein, was QT erzeugt. Evtl. mal im GUI-Framework-Forum fragen...


Anmelden zum Antworten