Problem mit der forward-deklaration



  • Hi hab da ein Problem mit der Forward-Deklaration. So ungefähr sehen meine Klassen aus:

    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 Funktionen;					<==== Zeile 23
    class Ui_AlertWindow : public QObject
    {
    	Q_OBJECT
    
    public slots:
    	void ok()
    	{
    		Functions->ausfuehren();		<==== Zeile 48
    	}
    
    public:
    	QWidget *centralwidget;
    	QPushButton *btnOk;
    	QLabel *lblUeberschrift;
    	Funktionen* Functions;
    
    	void setObject(Funktionen* funct){
    		Functions = funct;
    	}
    
    	void setupUi(QMainWindow *MainWindow)
    	{
    	...........
    	...........
    	........... 
    	...........
    	...........
    
    	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()));
    	QMetaObject::connectSlotsByName(MainWindow);
    	} // setupUi
    
    	...............
    	..............	
    	...............
    	................
    	..................
    	................
    	...............
    	..................
    	...................
    	...................
    	..................
    
    };
    
    #include "funktionen.h"
    
    namespace Ui {
        class AlertWindow: public Ui_AlertWindow {};
    
    } // namespace Ui
    
    #endif // UI_ALERT_H
    

    funktionen.h

    #ifndef FUNKTIONEN_H
    #define FUNKTIONEN_H
    
    #include <QFile>
    #include <QMainWindow>
    #include <fstream>
    #include <iostream>
    #include <QFileInfo>
    #include <QDateTime>
    
    #include "ui_gui.h"
    #include "ui_alert.h"
    
    #include <sys/stat.h>
    #include <time.h>
    #include <unistd.h>
    #include <string>
    #include <QString>
    #include <QDir>
    
    using namespace std;
    
    class Funktionen
    {
    	private:
    		..............
    		.............
    		..............
    		.............
    		..............
    		..............
    
    	public:
    		Funktionen();
    		~Funktionen();
    		void displayGUI();
    		void ausfuehren();
    		void uebergebeObjekt();
    		Ui::AlertWindow alert;
    		Ui::MainWindow ui;
    };
    
    void Funktionen::uebergebeObjekt()
    {
    	alert.setObject(this);
    }
    
    void Funktionen::displayGUI()
    {
    	//Initialisieren der GUI
    	QMainWindow *window = new QMainWindow();
        	alert.setupUi(window);
    	window->show();
    }
    
    void Funktionen::ausfuehren()
    {
    	//Das soll es später einfach ausführen
    }
    
    Funktionen::Funktionen()
    {
    
    }
    
    Funktionen::~Funktionen()
    {
    
    }
    
    #endif
    

    main.cpp

    #include <QApplication>
    #include "funktionen.h"
    
    int main(int argc, char *argv[])
    {
    	Funktionen test;	
    	QApplication app(argc, argv);	
    	test.uebergebeObjekt();			
    	test.displayGUI();			//hier initialisiert es die grafische Benutzeroberfläche
    }
    

    Beim compilieren bekomme ich diese Fehlermeldungen:
    ui_alert.h: In member function void Ui\_AlertWindow::ok()': ui_alert.h:48: error: invalid use of undefined typestruct Funktionen'
    ui_alert.h:23: error: forward declaration of `struct Funktionen'

    48: Functions->ausfuehren();
    23: class Funktionen;

    Wenn ich Zeile 48 lösche kommen keine Fehlermeldungen.

    Könntet ihr mir mal bitte erklären was ich jetzt tun soll.



  • KingV1k schrieb:

    Beim compilieren bekomme ich diese Fehlermeldungen:
    ui_alert.h: In member function void Ui\_AlertWindow::ok()': ui_alert.h:48: error: invalid use of undefined typestruct Funktionen'
    ui_alert.h:23: error: forward declaration of `struct Funktionen'

    Natürlich, der Compiler weiß nur dass es Funktionen gibt, nicht wie die Klasse aussieht. Implementiere den ok -Slot einfach in der cpp-Datei, und den ganzen (nicht-trivialen) Rest am besten auch gleich.



  • Mit der Forward-Deklaration kennt der Compiler nur den Namen der Klasse - das reicht nicht aus, um deren Methoden aufrufen zu können (oder Objekte von dem Typ anzulegen). Damit Zeile 48 funktionieren kann, brauchst du die komplette Klassendefinition.

    wenn du in der "funktionen.h" kein Ui_Alertwindow benötigst, solltest du die #includes umdrehen, andernfalls geht folgendes:

    class Funktionen;
    
    class Ui_Alertwindow : public CObject
    {
      ...
    public:
      void ok();
      ...
    };
    
    #include "funktionen.h"
    
    inline void Ui_Alertwindow::ok()
    {
      Funktions->ausfuehren();
    }
    


  • tut mir leid, aber ich versteh nicht wie du es meinst mit den ok-Slot in die cpp zu implementieren. könntest du es mal genauer erklären?

    edit:
    achso hab den beitrag von CStoll zu spät mitbekommen



  • Jetzt hab ich alle Methoden in der Datei ui_alert.h bearbeitet wie es CStoll gesagt hat, aber irgendwie will es noch immer nicht funktionieren. Selbe Fehlermeldungen nur andere Spalten.



  • KingV1k schrieb:

    Jetzt hab ich alle Methoden in der Datei ui_alert.h bearbeitet wie es CStoll gesagt hat, aber irgendwie will es noch immer nicht funktionieren. Selbe Fehlermeldungen nur andere Spalten.

    Du sollst die Implementationen in die "ui_alert.cpp" packen!



  • ok. hab ich gemacht aber es kommt jetzt diese Fehlermeldung:
    release\main.o:main.cpp:(.text+0x0): first defined here
    release\ui_alert.o:ui_alert.cpp:(.text+0x220): multiple definition of `Funktionen::ausfuehren()'

    und das für jede einzelne Methode in meiner Klasse Funktionen. was jetzt? hat jemand eine idee woher das kommt?



  • Die Methoden der Klasse 'Funktionen' solltest du natürlich auch in ein eigenes CPP-File auslagern (oder inline definieren - aber das lohnt sich nur bei sehr kleinen Funktionen).


Anmelden zum Antworten