C++/QT Problem bei Klammerung von if und goto

Gast #2590836
Lesenswert?

Hallo Forum,

ich habe folgendes Problemchen, ich möchte abhängig davon, ob das 
Programm mit --server gestartet wird entweder die "normale" Version oder 
die Serverversion starten.
Mein Fenster w wird nicht angezeigt, bzw ich vermute, dass es sobald es 
aus der Schleife wieder raus ist geschlossen und gelöscht wird. Stimmt 
das?


--------------
#include <QtGui/QApplication>
#include "client.h"
#include "server.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    if (argc>1)
    {
    Server w;
    w.show();
    }
else
    {
    Client w;
    w.show();
    }

    return a.exec();
}
---------------


also dachte ich, ich kann die Sache mit Goto lösen. Leider geht auch das 
folgende nicht:

------------
#include <QtGui/QApplication>
#include "client.h"
#include "server.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    if (argc>1) goto starteclient;
    else goto starteserver;

starteserver:
    {
    Server w;
    w.show();
    }

goto ende;


starteclient:
    {
    Client w;
    w.show();
    }

ende:
    return a.exec();
}
--------
habe ich keine Klammern bei den Sprungmarken gibt es "error:   crosses 
initialization of ...", habe ich Klammern dort, gibt es das selbe 
Ergebnis wie bei der Klammerung im ersten Beispiel.

Der Client und Servercode sind an sich ok. Wenn ich die Teile einzeln 
teste wird das Fenster angezeigt. Nur in den Klammern geht es nicht.

Könnt ihr mir bitte erklären, warum das so ist und wie ich das ganze 
lösen kann?

Vielen Dank schonmal
Walter
Gast #2591044
Lesenswert?

Walter schrieb:
> dass es sobald es
> aus der Schleife wieder raus ist geschlossen und gelöscht wird.

So ist es.

Bitte bitte kein goto verwenden.
Entweder du legst Client und Server als Variablen in den Scope der 
main-Funktion, also so wie die QApplication.

Oder die vermutlich bessere Variante ist, da speichersparender, "return 
a.exec();" in beide if-Pfade zu legen.
Persönliche Seite #2591062
Lesenswert?

Warum sollte sich das Problem der ersten Variante durch Verwendung von 
goto lösen lassen? Die Logik hinter dieser Idee erschließt sich mir 
nicht so recht.

> habe ich keine Klammern bei den Sprungmarken gibt es "error:   crosses
> initialization of ...",

Kein Wunder.


> habe ich Klammern dort, gibt es das selbe
> Ergebnis wie bei der Klammerung im ersten Beispiel.

Auch kein Wunder, siehe meine erste Frage.

Vergiss die "Idee" mit dem goto einfach gleich wieder.


Welche Verbindung haben Deine "clients" und "server" mit dem 
Applikationsobjekt a? So recht kann ich da keinen Bezug erkennen.

Wie sieht denn die funktionierende "server"- und wie die funktionierende 
"client"-Anwendung (als Standalone geschrieben) aus?
Gast #2591095
Lesenswert?

Rufus Τ. Firefly schrieb:
> Warum sollte sich das Problem der ersten Variante durch Verwendung von
> goto lösen lassen? Die Logik hinter dieser Idee erschließt sich mir
> nicht so recht.

Naja, ich dachte er kann dann zur Laufzeit entscheiden, welche Klasse w 
werden soll. Dass das hier aber Compilerlevel ist, ist mir entgangen.

> Welche Verbindung haben Deine "clients" und "server" mit dem
> Applikationsobjekt a? So recht kann ich da keinen Bezug erkennen.

Das ist qt. Das ist da so "ganz normal".

> Wie sieht denn die funktionierende "server"- und wie die funktionierende
> "client"-Anwendung (als Standalone geschrieben) aus?

Ist ein Qt-Stub der nur ein Fenster darstellt und hat eigentlich nichts 
mit dem Problem an sich zu tun.
#2591137
Lesenswert?

Walter schrieb:
>     if (argc>1)
>     {
>     Server w;

Hier wird dein Server-Objekt erzeugt.

>     w.show();

Hier wird ihm gesagt, daß es bei nächster Gelegenheint mal sichtbar 
werden soll.

>     }

Und hier wird es wieder zerstört, da der "scope" der Variable w endet. 
Wenn du es mit new erzeugst, wird es gehen. Sowas würde sich anbieten:
1
    QWidget* w;
2

3
    if (argc>1)
4
    {
5
        w = new Server();
6
    }
7
    else
8
    {
9
        w = new Client();
10
    }
11
    w->show();
12
    return app.exec();

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren