Qt: alle Subklassen sollen mit statischer Methode aufgerufen werden

Orbit

Erfahrenes Mitglied
Moin,

folgendes Problem:
Eine Klasse A wird beliebig oft vererbt (an B, C, und D ... ) soll aber diese Klassen nicht kennen müssen, dies wäre extrem umständlich.
In Klasse A soll es nun eine statische Liste geben, in die jede Subklasse beim Start ihren Senf einträgt (zum Besipiel ein QAction dass beim Aufruf ein Fentser (A erbt von QWidget) aus der jeweiligen Klasse öffnet).
Ist auch egal, es soll jedenfalls etwa so ausseheen, dass es eine virtuelle Methode in jeder Klasse gibt "register", A beim Start einmal für jede Subklasse "register" ausführt und somit die Liste in A gefüllt wird.
Ich meine NICHT, dass jede Klasse im Konstruktor ihren Teil in die Liste schreibt; das kann ich selber:-) da wäre ja das Problem dass ich von jeder Subklasse erst ein Objekt erstellen müsste.

Gibt es da in Qt 4.5 irgendeine Variante das zu tun?
Vielen Dank fürs Lesen und Denken!
mfg,
Orbit
 
In Klasse A soll es nun eine statische Liste geben, in die jede Subklasse beim Start ihren Senf einträgt (zum Besipiel ein QAction dass beim Aufruf ein Fentser (A erbt von QWidget) aus der jeweiligen Klasse öffnet).
Was heißt „beim Start“? Wenn das Programm startet? Wenn eine Instanz von A erstellt wird? Welchen „Senf“ sollen die Subklassen eintragen?

Ist auch egal, es soll jedenfalls etwa so ausseheen, dass es eine virtuelle Methode in jeder Klasse gibt "register", A beim Start einmal für jede Subklasse "register" ausführt und somit die Liste in A gefüllt wird.
Ich meine NICHT, dass jede Klasse im Konstruktor ihren Teil in die Liste schreibt; das kann ich selber:-) da wäre ja das Problem dass ich von jeder Subklasse erst ein Objekt erstellen müsste.
Wie willst du denn eine virtuelle Methode aufrufen, ohne eine Instanz zu haben?
 
Zuletzt bearbeitet:
Also ich stelle es mir so vor dass die Klasse A eine Methode anbietet die alle anderen Klassen lädt; also quasi beim Programmstart oder auch später aber auf jeden Fall bevor von jeder Subklasse ne Instanz erzeugt wurde; die Liste ist unabhängiog von Objekten und enthält nur Klasseninformationen.
Der Senf könnte zB so aussehen dass in der Liste hinterher jede Subklasse von A einen QString oder eben ne QAction da eingefügt hat; aber eben Klassenabhängig!

Code:
class A:public QWidget{
      ...
     static void loadSubClasses();
     virtual void register();
     static QList<QString> classNames;

}
A::classNames = new QList<QString>;

class B : public A {
     void register();
}

void B::register(){
     classNames<<"name der klasse B";
}

..
und halt so dass man aus main() die Methode A::loadSubClasses aufrufen kann.

LG Orbit
 
Meinst du das vielleicht so?
C++:
#include <iostream>
#include <string>
#include <vector>

class A {
 public:
  static void PrintSubclasses() {
    std::vector<std::string>::const_iterator it = classNames().begin();
    for (; it != classNames().end(); ++it) {
      std::cout << *it << std::endl;
    }
  }

 protected:
  static std::vector<std::string> &classNames() {
    static std::vector<std::string> *inst = new std::vector<std::string>();
    return *inst;
  }
};

template<typename T>
class CallRegisterOnInit {
 public:
  CallRegisterOnInit() {
    T::Register();
  }
};

class B : public A {
 public:
  static void Register() {
    classNames().push_back("Klasse B");
  }
};
static CallRegisterOnInit<B> __call_register_on_init_B;

class C : public A {
 public:
  static void Register() {
    classNames().push_back("Klasse C");
  }
};
static CallRegisterOnInit<C> __call_register_on_init_C;

int main(void) {
  A::printSubClasses();
  return 0;
}

Grüße, Matthias
 
Zuletzt bearbeitet von einem Moderator:
Zurück