Forum: PC-Programmierung Qt C++ Constructor reimplementieren


von Peter D. (pdiener) Benutzerseite


Lesenswert?

Hallo,

ich möchte gerne, dass anstatt dem Constructor
1
QApplication(int &argc, char **argv)
der folgende benutzt wird
1
QApplication(int &argc, char **argv, bool GUIenabled)

Und das, in dem der obere benutzt wird.
Ich suche also nach einer Möglichkeit, einen Aufruf des oberen 
Constructors abzufangen und an den unteren zu leiten, wobei GUIenabled 
auf "false" gesetzt werden soll.

Kann man einen Constructor so reimplementieren, dass das passiert?

Grüße,

Peter

von Karl H. (kbuchegg)


Lesenswert?

Eigene Klasse von QApplication ableiten, dort den gewünschten 
Konstruktor implementieren und dann mit dieser neuen Klasse das 
Application Objekt in main anlegen.

Andere Chance hast du nicht, wenn du nicht den Original QT Code 
verändern willst, was zwar möglich aber nicht ratsam ist.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Das Problem ist, dass QApplication als template an QService übergeben 
wird.
1
QService<QApplication>(argc, argv, APPNAME);

Ich habe schon versucht, eine eigene Klasse anzulegen

class myApp : public QApplication
{
public:
   myApp(int &argc, char **argv);
}

Aber wird hier nicht automatisch der Default-Constructor von 
QApplication benutzt? Oder wie umgeht man das?

Jedenfalls darf ich das wohl nicht:

QService<myApp>(argc, argv, APPNAME);

von ich (Gast)


Lesenswert?

Peter Diener schrieb:
> Das Problem ist, dass QApplication als template an QService übergeben
> wird.
> QService<QApplication>(argc, argv, APPNAME);
>
> Ich habe schon versucht, eine eigene Klasse anzulegen
>
> class myApp : public QApplication
> {
> public:
>    myApp(int &argc, char **argv);
> }
>
> Aber wird hier nicht automatisch der Default-Constructor von
> QApplication benutzt? Oder wie umgeht man das?

Ja, außer du rufst den gewünschten Konstruktor explizit auf.
1
 class myApp : public QApplication
2
  {
3
  public:
4
    myApp(int &argc, char **argv)
5
      : QApplication(argc, argv, false)
6
    {};
7
  }

> Jedenfalls darf ich das wohl nicht:
>
> QService<myApp>(argc, argv, APPNAME);

Das sollte prinzipiell so funktionieren.
Allerdings stellt sich mir die Frage, was QService eigentlich genau 
macht, da ich es in der Qt Dokumentation nirgends finden konnte.

von Klaus W. (mfgkw)


Lesenswert?

Du kannst auch den Basis-ctor im abgeleiteten ctor aufrufen, aber nur 
nach dem : und vor dem Rumpf des abgeleiteten.
Wenn der Rumpf des abgeleiteten ctor läuft, muß der Basisteil 
schließlich schon initialisiert sein.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Ich habs jetzt anders gemacht. Ich hab in QtService die Methode 
(createApplication) reimplementiert, die das QApplication Objekt 
konstruiert. Dort kann man ganz problemlos den anderen Konstruktor 
aufrufen.

Danke für die ganzen Antworten.

>Du kannst auch den Basis-ctor im abgeleiteten ctor aufrufen

Das Problem war, dass eine von QApplication abgeleitete Klasse nicht als 
Template für QTService verwendet werden kann - warum auch immer. 
Normalerweise müsste das problemlos gehen, zumindest, solang man nicht 
irgendwelche Member oder Methoden verdeckt.

Grüße,

Peter

von Rolf Magnus (Gast)


Lesenswert?

Peter Diener schrieb:
> Das Problem war, dass eine von QApplication abgeleitete Klasse nicht als
> Template für QTService verwendet werden kann - warum auch immer.

Wie bist du denn auf die Idee gekommen, daß man das nicht kann?

von Klaus W. (mfgkw)


Lesenswert?

Evtl. eine template-Klasse, die vom template der Basis ableitet.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

>Wie bist du denn auf die Idee gekommen, daß man das nicht kann?

Es gab eine Fehlermeldung, dass die Klasse, die ich verwendet habe, 
dafür nicht geeignet ist. Dabei hab ich nichts anderes gemacht, als 
genau von der Klasse abgeleitet, die als Template funktioniert. Nichts 
zusätzlich deklariert oder überladen.

Ich hab das leider gerade nicht hier. Vielleicht hab ich ja irgendwas 
falsch gemacht, obwohl man daran eigentlich nicht viel verkehrt machen 
kann.
Ist auch nicht so wichtig, ich habs ja jetzt anders gelöst. Bei 
Gelegenheit werd ich nochmal versuchen, das Verhalten nachzuvollziehen.

Grüße,

Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.