[Gelöst] Vererbung

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
ReasyEasyPeasy
Beiträge: 18
Registriert: 10. Juli 2015 15:47

[Gelöst] Vererbung

Beitrag von ReasyEasyPeasy »

Moin,
ich habe mir einen Button erstell, der mir die ID des Buttons ausgibt, der geklickt wird. Ich habe das mit Hilfe eines Buches gemacht. Dazu hätte ich 2-3 kurze Fragen:
idbutton.h

Code: Alles auswählen

#ifndef IDBUTTON
#define IDBUTTON
#include <QString>
#include <QWidget>
#include <QPushButton>

class IdButton : public QPushButton{
    Q_OBJECT
public:
    IdButton(const QString& text, int id, QWidget* parent= NULL);
    IdButton(const QString& text, QWidget* parent= NULL);
private:
    static int nextId;
    int m_id;
public slots:
    void click();
signals:
    void clicked(int id);
};
idbutton.cpp

Code: Alles auswählen

#include "../header/idbutton.h"

int IdButton::nextId = 0;

IdButton::IdButton(const QString& text, int id, QWidget *parent) : QPushButton(text, parent), m_id(id){
    connect(this,SIGNAL(clicked()),this,SLOT(click()));
}
IdButton::IdButton(const QString& text, QWidget *parent) : QPushButton(text,parent), m_id(nextId++){
    connect(this,SIGNAL(clicked()),this,SLOT(click()));
}

void IdButton::click(){
    emit clicked(m_id);
}
Das mit den Signalen und Slots habe ich verstanden.
Allerdings verstehe ich nicht ganz was "m_id(id) " und m_id(nextId++) macht. Und warum habe ich zwei Konstruktoren? Static Varibalen gelten für alle Instanzen einer Klasse oder?

Nun möchte ich einen weiteren Button erstellen der diese Funktion, dass man gucken kann welcher Button gedrückt wurde, erben soll. Wie mache ich das? Ich habe es so probiert:
symbolbutton.h

Code: Alles auswählen

#ifndef SYMBOLBUTTON
#define SYMBOLBUTTON
#
#include "idbutton.h"
class SymbolButton : public IdButton{
    Q_OBJECT
public:
    SymbolButton(const QString& text, int id, QWidget* parent= NULL);
    SymbolButton(const QString& text, QWidget* parent= NULL);
private:
    static int nextId;
    int m_id;
}
#endif // SYMBOLBUTTON
symbolbutton.cpp

Code: Alles auswählen

#include "../header/symbolbutton.h"
int SymbolButton :: nextId=0;
SymbolButton::SymbolButton(const QString &text, int id, QWidget *parent) : IdButton(text, id, parent),QPushButton(text, parent),m_id(id){
}

SymbolButton::SymbolButton(const QString &text, QWidget *parent) : IdButton( text,parent), QPushButton(text, parent), m_id(nextid++){
}
Ich habe hier versucht die Konstruktoren der Basisklassen richtig aufzurufen, aber ich denke das es falsch ist.
Ich würde mich sehr freuen, wenn sich jemand 5 min nimmt und mir einmal erklärt was ich hier beachten muss.
Liebe Grüße :)
Zuletzt geändert von ReasyEasyPeasy am 30. Juli 2015 13:50, insgesamt 1-mal geändert.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Vererbung

Beitrag von RHBaum »

Konstruktoraufbau:

Signatur:InitialisierungsListe{Implementation}

also alles was zwischen Signatur, nach dem doppelpunkt, und vor der geschweiften Klammerfür den Begin des Implementationsblockes kommt, ist die Initialisierungsliste !
http://www.cprogramming.com/tutorial/in ... s-c++.html
Kurz damit werden Membervariablen initialisiert, bevor der erste code der klasse (der Konstruktor) ausgeführt wird.
Die Basisklasse(n) sind da wie member und koennen nur dort mit parametern bestückt werden um entsprechende Konstruktoren der basisklassen zu verwenden.
Initialisierung an dieser stelle ist auch wirklich initialisierung und keine zuweisung .... const Member koennen da auch initialisiert werden, im gegensatz zum Konstruktor rumpf ...

In deinem Beispiel:
Du erbst von ID Button (eh schlechte idee, wegens Konstruktor und Signal Slot mechanik zu verereben, aber erstmal egal)
damit bekommst du das verhalten vom ID button und dessen konstruktoren ...
SignalButton sollte das nicht versuchen zu überschreiben, sonst wär die vererbung sinnlos ...

Die konstruktor Syntax vom symbolbutton sollte so aussehen ...

Code: Alles auswählen

#ifndef SYMBOLBUTTON
#define SYMBOLBUTTON

#include "idbutton.h"
class SymbolButton : public IdButton{
    Q_OBJECT
public:
    SymbolButton(const QString& text, int id, QWidget* parent= NULL);
    SymbolButton(const QString& text, QWidget* parent= NULL);
}

Code: Alles auswählen

    #include "../header/symbolbutton.h"

    SymbolButton::SymbolButton(const QString &text, int id, QWidget *parent) : IdButton(text, id, parent){
    }

    SymbolButton::SymbolButton(const QString &text, QWidget *parent) : IdButton( text,parent){
    }
das Handling und initialisierung mit der ID macht dir eh schon der ID button.
um auf die m_id des IdButton von der abgeleiteten klasse aus zuzugreifen, musst die member in IdButton nur protected oder public machen (schlechte idee) oder Zugriffsfunktionen in IdButton definieren, die Zugriff erlauben.
IdButton sollte eh nen getter für die ID Haben, den auch SymbolButton verwenden darf (minimum protected) ....

QPushbutton darfst Du in SymbolButton nicht initialisieren, weil du nicht direkt von QPushbutton ableitetest, sondern von ID Button. QPushbutton zu initialisieren ist somit aufgabe von ID Button ....

Anmerkung:
Falls es bei deinem Problem um die reelle Lösung eines Problemes geht, also nicht um Lernzwecke, solltest den vererbungskram vergessen und stattdessen nen SignalMapper http://doc.qt.io/qt-5/qsignalmapper.html verwenden

Ciao ....
ReasyEasyPeasy
Beiträge: 18
Registriert: 10. Juli 2015 15:47

Re: Vererbung

Beitrag von ReasyEasyPeasy »

ok vielen Dank!
Antworten