Superkonstruktor wie in Java



  • also eine möglichkeit wär ja, wenn ich in der Klasse Ui_AlertWindow die Funktion bool isclicked(); erstelle und eine variable int clicked = 0; erstelle

    bool isclicked(){
    	if(clicked==1){
    		return true;
    	}
    	else{
    		return false;
    	}
    
    }
    

    und außerdem die Funktion ok() überarbeite. ungefähr so:

    void ok()
    {
    	clicked = 1;	
    }
    

    dann kann ich in der main meiner main.cpp folgendes machen

    int main(int argc, char *argv[])
    {
    .........
    ..........
    .......
    ........
    ..........
    ...........
    ...........
    ..........
    ........
    ...........
    .........
    while(alert.isclicked() == false){
    	//es soll so lange in der schleife bleiben, bis der button nicht geklickt wurde
    	//damit es das system nicht in die knie zwingt kann ich noch eine verzögerung einbauen
    }
    //wenn der button endlich geklickt wurde geht er aus der schleife raus und führt die nächste anweisung aus
    test.ausfuehren();
    
    }
    

    aber das problem auf dieser art zu lösen finde ich zu unschön



  • Inwiefern hängen QMainWindow und Ui_AlertWindow zusammen?
    Nochmal, du mußt deiner Fensterklasse (sei es nun QMainWindow oder Ui_AlertWindow) eine Instanz auf Funktionen übergeben (z.Bsp. im Konstruktor). Du hast in einer Funktion keinen Zugriff auf die aufrufende Funktion (Klasse). Das Konzept mit der Superklasse aus Java beinhaltet AFAIK ja auch etwas anderes. Da geht es ja wohl um Vererbungshierarchien.
    Deine Fensterklassen erben aber nicht von Funktionen und kennen deshalb auch nicht dessen memberfunktionen.
    Also

    class Funktionen
    {
    // Konstruktor etc.
      void ausfuehren()
      {}
    };
    
    class fenster
    {
    public:
       fenster(Funktionen* funct) : Functions(funct) {}
    public slots:
        void ok()
        {
           Functions->ausfuehren();
        }
    private:
        Funktionen* Functions;
    // Rest
    };
    


  • ok. gut ich habe jetzt mein code dementsprechend verändert. aber ich bekomme jetzt compilerfehler:
    ui_alert.h:58: error: ISO C++ forbids declaration of Funktionen' with no type ui_alert.h:58: error: expected;' before '*' token
    ui_alert.h:61: error: expected )' before '*' token ui\_alert.h: In member functionvoid Ui_AlertWindow::ok()':
    ui_alert.h:31: error: `Functions' undeclared (first use this function)
    ui_alert.h:31: error: (Each undeclared identifier is reported only once for each function it appears in.)

    31: Functions->ausfuehren();
    58: Funktionen* Functions;
    61: Ui_AlertWindow(Funktionen* funct) : Functions(funct){}

    leigt der Fehler vielleicht darin das meine beiden Klassen sich in unterschiedlichen Dateien befinden?



  • Ja.
    Du solltest den Header, wo Funktionen deklariert wurde mit einbinden.



  • ok ich hab oben ein #include "main.cpp" eingefügt.

    die fehler von vorhin sind weg, aber jetzt sind noch viel mehr neue Fehler entstanden 😮

    mein Compiler sagt:
    In file included from ui_alert.h:18,
    from main.cpp:9:
    main.cpp:68: error: using-declaration for non-member at class scope
    main.cpp:68: error: expected ;' before "alert" main.cpp: In member functionvoid Funktionen::getPath()':
    main.cpp:160: error: alert' undeclared (first use this function) main.cpp:160: error: (Each undeclared identifier is reported only once for each function it appears in.) main.cpp: In member functionvoid Funktionen::date_of_ini()':
    main.cpp:210: error: alert' undeclared (first use this function) main.cpp: In member functionvoid Funktionen::date_of_template()':
    main.cpp:306: error: alert' undeclared (first use this function) main.cpp: In member functionvoid Funktionen::files_available()':
    main.cpp:415: error: alert' undeclared (first use this function) main.cpp: In member functionvoid Funktionen::displayGUI()':
    main.cpp:566: error: alert' undeclared (first use this function) main.cpp: In constructorFunktionen::Funktionen()':
    main.cpp:587: error: alert' undeclared (first use this function) In file included from main.cpp:9: ui\_alert.h: In member functionvoid Ui_AlertWindow::ok()':
    ui_alert.h:32: error: 'class Funktionen' has no member named 'ausfuehren'
    ui_alert.h: At global scope:
    ui_alert.h:177: error: base Ui\_AlertWindow' with only non-default constructor in class without a constructor main.cpp:21: error: redefinition ofclass Funktionen'
    main.cpp:21: error: previous definition of class Funktionen' main.cpp: In functionint qMain(int, char**)':
    main.cpp:73: error: redefinition of int qMain(int, char**)' main.cpp:73: error:int qMain(int, char**)' previously defined here
    main.cpp: At global scope:
    main.cpp:155: error: redefinition of void Funktionen::getPath()' main.cpp:155: error:void Funktionen::getPath()' previously defined here
    main.cpp: In member function void Funktionen::getPath()': main.cpp:160: error:alert' undeclared (first use this function)
    main.cpp: At global scope:
    main.cpp:196: error: redefinition of void Funktionen::date\_of\_ini()' main.cpp:196: error:void Funktionen::date_of_ini()' previously defined here
    main.cpp: In member function void Funktionen::date\_of\_ini()': main.cpp:210: error:alert' undeclared (first use this function)
    main.cpp: At global scope:
    main.cpp:292: error: redefinition of void Funktionen::date\_of\_template()' main.cpp:292: error:void Funktionen::date_of_template()' previously defined here
    main.cpp: In member function void Funktionen::date\_of\_template()': main.cpp:306: error:alert' undeclared (first use this function)
    main.cpp: At global scope:
    main.cpp:396: error: redefinition of void Funktionen::files_available()' main.cpp:396: error:void Funktionen::files_available()' previously defined here
    main.cpp: In member function void Funktionen::files_available()': main.cpp:415: error:alert' undeclared (first use this function)
    main.cpp: At global scope:
    main.cpp:425: error: redefinition of void Funktionen::getServerName\_and\_IP()' main.cpp:425: error:void Funktionen::getServerName_and_IP()' previously defined here
    main.cpp:501: error: redefinition of void Funktionen::showServerName()' main.cpp:501: error:void Funktionen::showServerName()' previously defined here
    main.cpp:515: error: redefinition of void Funktionen::get\_Path\_of_App()' main.cpp:515: error:void Funktionen::get_Path_of_App()' previously defined here
    main.cpp:528: error: redefinition of void Funktionen::unrar()' main.cpp:528: error:void Funktionen::unrar()' previously defined here
    main.cpp:557: error: redefinition of void Funktionen::setArray()' main.cpp:557: error:void Funktionen::setArray()' previously defined here
    main.cpp:565: error: redefinition of void Funktionen::displayGUI()' main.cpp:565: error:void Funktionen::displayGUI()' previously defined here
    main.cpp: In member function void Funktionen::displayGUI()': main.cpp:566: error:alert' undeclared (first use this function)
    main.cpp: At global scope:
    main.cpp:585: error: redefinition of Funktionen::Funktionen()' main.cpp:585: error:Funktionen::Funktionen()' previously defined here
    main.cpp: In constructor Funktionen::Funktionen()': main.cpp:587: error:alert' undeclared (first use this function)
    main.cpp: At global scope:
    main.cpp:593: error: redefinition of Funktionen::~Funktionen()' main.cpp:593: error:Funktionen::~Funktionen()' previously defined here

    also wie ich sehe kann ich es vergessen.oder was soll ich machen?



  • Neeeiiiin!
    Du sollst keine cpp und schon garnicht die main.cpp inkludieren. Lagere die Deklaration der Klasse Funktionen in eine Headerdatei aus und inkludiere die.
    Ich habe das Gefühl, du solltest dir nochmal ein Tutorial zu diesen Themen durchlesen bevor du mit QT weitermachen willst. Ist jetzt nicht böse gemeint.



  • ok. da hast du wohl recht. kennst du vielleicht ein gutes tutorial dazu. ich hab grad eben bischen gegooglet, aber nichts tolles gefunden.





  • ok. habs ich jetzt gemacht. der compiler sagtt jetzt folgendes:
    In file included from ui_alert.h:18,
    from main.cpp:9:
    funktionen.h:39: error: using-declaration for non-member at class scope
    funktionen.h:39: error: expected ;' before "alert" In file included from main.cpp:9: ui\_alert.h:172: error: baseUi_AlertWindow' with only non-default constructor in class without a constructor
    mingw32-make: *** [release\main.o] Error 1

    39: Ui::AlertWindow alert;
    172: class AlertWindow: public Ui_AlertWindow {};

    kann mir das jemand erklären? oder sagen was ich tun soll?



  • 39
    funktionen.h scheint Ui::AlertWindow nicht zu kennen. Mach diese Klasse bekannt. Was ist denn Ui, ein namespace?
    172

    class AlertWindow: public Ui_AlertWindow {};
    

    Hier deklarierst du die Klasse AlertWindow abgeleitet von Ui_AlertWindow ohne einen neuen Konstruktor zu deklarieren. Der Compiler versucht dann den default-Konstruktor zu erzeugen. Dieser muß den default-Konstruktor der Basisklasse Ui_AlertWindow aufrufen. Diese hat aber keinen, da dort ein nicht-default-Konstruktor existiert.
    Entweder du spendierst der Basisklasse einen Default-Konstruktor (ohne Argumente) oder du deklarierst in AlertWindow einen eigenen Konstruktor welcher den Konstruktor der Basisklasse aufruft.


Anmelden zum Antworten