Superkonstruktor wie in Java



  • da ich gestern schon seelisch komplett am ende war probier ich es jetzt nochmal von anfang.
    also meine beiden Dateien main.cpp und ui_alert.h findet ihr unten. hätte jemand eine gute Idee wie ich den Titel dieses Topics nennen kann?

    main.cpp

    #include <iostream>
    #include <fstream>
    #include <sys/stat.h>
    #include <time.h>
    #include <unistd.h>
    #include <string>
    #include <QApplication>
    #include "ui_alert.h"
    #include <QFile>
    #include <QFileInfo>
    #include <QDateTime>
    #include <QDir>
    #include <QString>
    using namespace std;
    
    class Funktionen
    {
    	private:
    		//hier stehen ein paar variablen
    
    	public:
    		Funktionen();
    		~Funktionen();
    		void ausfuehren();
    		void displayGUI();
    		Ui::AlertWindow alert;
    
    };
    
    int main(int argc, char *argv[])
    {
    
    	Funktionen test;
    	QApplication app(argc, argv);
    	test.displayGUI();
    	return app.exec();
    	test.~Funktionen();
    }
    
    void Funktionen::displayGUI() //diese Methode sorgt dafür das das Fenster angezeigt wird
    {
    	QMainWindow *window = new QMainWindow();
        	alert.setupUi(window);
    	window->show();
    }
    
    Funktionen::ausfuehren()
    {
    	//Anweisungen	
    }
    
    Funktionen::Funktionen()
    {
    	//Anweisungen
    }
    
    Funktionen::~Funktionen()
    {
    	//Anweisungen	
    }
    

    ui_alert.h

    #ifndef UI_ALERT_H
    #define UI_ALERT_H
    
    #include <QtCore/QVariant>
    #include <QtGui/QAction>
    #include <QtGui/QApplication>
    #include <QtGui/QButtonGroup>
    #include <QtGui/QFrame>
    #include <QtGui/QLabel>
    #include <QtGui/QMainWindow>
    #include <QtGui/QPushButton>
    #include <QtGui/QWidget>
    #include <QObject>
    #include <string>
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    class Ui_AlertWindow : public QObject
    {
    	Q_OBJECT
    
    public slots:
    	void ok()
    	{
    
    		/*
    		hier muss die Funktion Funktionen::ausfuehren aufgerufen werden.
    		keine ahnung wie ich das machen soll.
    		das war meine Frage wie ich es machen soll
                      ich habs mir so vorgestellt:
                      super.ausfuehren();
                      aber das geht ja so nicht
    		*/
    
    	}
    
    public:
    	QWidget *centralwidget;
    	QPushButton *btnOk;
    	QLabel *lblUeberschrift;
    
        void setupUi(QMainWindow *MainWindow)
        {
        MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        QApplication::setStyle("plastique");
        QFont font;
        font.setFamily(QString::fromUtf8("Arial Black"));
        MainWindow->setFont(font);
        MainWindow->setCursor(QCursor(static_cast<Qt::CursorShape>(0)));
        centralwidget = new QWidget(MainWindow);
        centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
    
        btnOk = new QPushButton(centralwidget);
        btnOk->setObjectName(QString::fromUtf8("btnOk"));
        btnOk->setGeometry(QRect(210, 70, 75, 41));
        QFont font2;
        font2.setFamily(QString::fromUtf8("Arial Black"));
        btnOk->setFont(font2);
    
        lblUeberschrift = new QLabel(centralwidget);
        lblUeberschrift->setObjectName(QString::fromUtf8("lblUeberschrift"));
        lblUeberschrift->setGeometry(QRect(10, 20, 495, 21));
        lblUeberschrift->setAlignment(Qt::AlignHCenter);
        QFont font4;
        font4.setFamily(QString::fromUtf8("Arial Black"));
        font4.setPointSize(8);
        lblUeberschrift->setFont(font4);
    
        MainWindow->setCentralWidget(centralwidget);
    
        retranslateUi(MainWindow);
    
        QSize size(516, 132);
        size = size.expandedTo(MainWindow->minimumSizeHint());
        MainWindow->resize(size);
        MainWindow->setMinimumWidth(516);
        MainWindow->setMinimumHeight(132);
        MainWindow->setMaximumWidth(516);
        MainWindow->setMaximumHeight(132);
    
    	QObject::connect(btnOk, SIGNAL(clicked()), this, SLOT(ok()));
    	QObject::connect(btnOk, SIGNAL(clicked()), MainWindow, SLOT(close()));
    
        QMetaObject::connectSlotsByName(MainWindow);
        } // setupUi
    
        void retranslateUi(QMainWindow *MainWindow)
        {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "Ueberschrift", 0, QApplication::UnicodeUTF8));
        btnOk->setText(QApplication::translate("MainWindow", "OK", 0, QApplication::UnicodeUTF8));
        lblUeberschrift->setText(QApplication::translate("MainWindow", "blabla", 0, QApplication::UnicodeUTF8));
        Q_UNUSED(MainWindow);
        } // retranslateUi
    
    };
    
    namespace Ui {
        class AlertWindow: public Ui_AlertWindow {};
    } // namespace Ui
    
    #endif // UI_ALERT_H
    


  • 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