Zwei kleine unklare Compilermeldungen (Qt)



  • Huhu !

    Ich hab jetzt in C++ mittels Qt ein kleines Programm geschrieben und auch alles im Code geflickt, was der Compiler beanstandet hat. Alles, bis auf zwei mir vollkommen unklare Meldungen:

    tom@debian:~/eigene dateien/Programmieren/qt-kde Programmierung/tut8$ make
    g++ -c -pipe -Wall -W -O2  -DQT_NO_DEBUG -DQT_SHARED -I/usr/share/qt3/mkspecs/default -I. -I. -I/usr/include/qt3 -o main.o main.cpp
    main.cpp:12: semicolon missing after declaration of `MyCannonField'
    main.cpp:15: multiple types in one declaration
    make: *** [main.o] Error 1
    

    Das Programm öffnet ein Fenster und platziert darin einen Button Quit, einen Slider, ein selbstdefiniertes QWidget MyCannonField und ein QLCDNumber-Display.

    Ich poste mal den Qellcode. Ich weiss ist echt ein bisschen viel verlangt, aber ich würde mich riesig freuen, wenn Ihr Euch das kurz durchlesen würdet:

    Hier die Headerdatei: mycannonfield.h

    #include <qwidget.h>
    
    #define null NULL
    
    class MyCannonField : public QWidget {
    
      Q_OBJECT
    
        int angle;
    
        public:
      MyCannonField( int angle, QWidget* parent, const char* name);
    
      int getAngle() {
        return this->angle;
      }
    
      public slots:
      void setAngle(int);
    
     signals:
      void angleChanged(int);
    
     protected:
      void paintEvent(QPaintEvent* );
    }
    

    Hier ist MyCannonField.cpp:

    #include <qwidget.h>
    
    #include "mycannonfield.h"
    
    #define null NULL
    
    MyCannonField::MyCannonField(int angle = 0, QWidget* parent = 0, const char* name = 0) : QWidget( parent, name) {
      this->angle = angle;
    }
    
    /*..declaration of the setAngle slot...*/
    void MyCannonField::setAngle(int angle()) {
      this->angle = angle;
      repaint();
      emit angleChanged(angle);
    }
    
    /*...paint the angle-information onto the screen...*/
    void MyCannonField::paintEvent( QPaintEvent * )
    {
        QString s = "Angle = " + QString::number( ang );
        QPainter p( this );
        p.drawText( 200, 200, s );
    }
    

    Und zum Schluss meine main-Methode:

    #include <qapplication.h>
    #include <qpushbutton.h>
    #include <qwidget.h>
    #include <qlcdnumber.h>
    #include <qlayout.h>
    #include <qslider.h>
    
    #include "mycannonfield.h"
    
    #define null NULL
    
    /* Compiler beanstandet: Zeile 12 */ class MyWidget: public QWidget {
     public:
      MyWidget( QWidget* parent , const char* name );
    /* Compiler beanstandet: Zeile 15 */ };
    
    MyWidget::MyWidget( QWidget* parent = null , const char* name = null) : QWidget(parent, name) {
    
        /*...GridLayout for formatation...*/
        QGridLayout* qGrid = new QGridLayout(this, 2, 2);
    
        /*...defining some objects, we want to integrate...*/
        QPushButton* qButt = new QPushButton("Quit this shit", this, null);
    
        QSlider* qSlider = new QSlider(this);
        qSlider->setRange(0,99);
    
        QLCDNumber *lcd = new QLCDNumber(this);
    
        MyCannonField* myCannon = new MyCannonField(25, this, null);
    
        /*connect signals and slots of some objects above...*/
        QObject::connect(qButt, SIGNAL(clicked()),
    		     qApp, SLOT(quit()));
    
        QObject::connect( qSlider, SIGNAL( valueChanged(int) ),
    		      lcd, SLOT(display(int)));
    
        QObject::connect( qSlider, SIGNAL( valueChanged(int)),
    		      myCannon, SLOT( setAngle(int)));
    
        /*...Now, add all object into the qGrid...*/
        qGrid->addWidget(qButt,1,2);
        qGrid->addWidget(lcd,1,1);
        qGrid->addWidget(qSlider,2,1);
        qGrid->addWidget(myCannon,2,2);
    } //end class MyWidget
    
    int main(int argc, char** argv) {
        QApplication* qApp = new QApplication(argc, argv);
        MyWidget* myWidget = new MyWidget();
        qApp->setMainWidget(myWidget);
        myWidget->show();
    
        return qApp->exec();
    }
    

    Das waren die Quelltexte. Ich finde bis jetzt keinen Fehler, insbesondere in Zeile 12 und 15 nicht.

    Ich hoffe einer von Euch weiss hier Bescheid, ich blicke jedenfalls nicht durch.
    Über Hilfe würde ich mich jedenfalls sehr freuen.

    mfg
    tom



  • der Compiler sagt doch alles, was du wissen musst.

    class und struct deklarationen muessen mit ; abgeschlossen werden

    class foo {
    }; //<-- das ; ist wichtig!
    


  • Hi !

    Vielen Dank für die Antwort. Ich bin aber trotzdem sehr überrascht. Der Compiler verweist auf Zeilen in main.cpp und der Fehler liegt aber in mycannonfield.h. Das ist doch total unlogisch. Hab ich was falsch verstanden ??

    Aber ich muss Euch schon wieder mit einer mir unentschlüsselbaren Meldung des Compilers nerven.

    tom@debian:~/eigene dateien/Programmieren/qt-kde Programmierung/tut8$ make
    g++ -c -pipe -Wall -W -O2  -DQT_NO_DEBUG -DQT_SHARED -I/usr/share/qt3/mkspecs/default -I. -I. -I/usr/include/qt3 -o MyCannonField.o MyCannonField.cpp
    MyCannonField.cpp: In member function `virtual void
       MyCannonField::paintEvent(QPaintEvent*)':
    MyCannonField.cpp:22: variable `QPainter p' has initializer but incomplete type
    make: *** [MyCannonField.o] Error 1
    

    Das erhalte ich, wenn er folgenden Code kompilieren will:

    #include <qwidget.h>
    #include <qstring.h>
    
    #include "mycannonfield.h"
    
    #define null NULL
    
    MyCannonField::MyCannonField(int angle , QWidget* parent , const char* name ) : QWidget( parent, name) {
      this->angle = angle;
    }
    
    void MyCannonField::setAngle(int angle) {
      this->angle = angle;
      repaint();
      emit angleChanged(angle);
    }
    
    void MyCannonField::paintEvent( QPaintEvent * )
    {
        QString s = "Angle = " + QString::number( angle );
        QPainter p( this );
        p.drawText( 200, 200, s );
    }
    

    Was bedeutet die Zeiel: variable `QPainter p' has initializer but incomplete type ??

    Tut mir echt Leid, wenn das nervt, aber ich bin ein frischer C++ und Qt Coder :p

    mfg
    tom



  • TomDaHomm schrieb:

    Ich bin aber trotzdem sehr überrascht. Der Compiler verweist auf Zeilen in main.cpp und der Fehler liegt aber in mycannonfield.h. Das ist doch total unlogisch.

    Nicht wirklich. #include ist eine reine Textersetzung, d.h., an der Stelle, wo #include "blah.h" steht, fuegt der Praeprozessor den Inhalt der Datei blah.h ein. Und damit ist der Fehler dann auch in Deinem Hauptprogramm.

    Wundert mich allerdings trotzdem, normalerweise ist der gcc so intelligent, BEIDE Dateien anzugeben... Vielleicht ist das Problem, dass der Fehler erst hinter dem Ende der Headerdatei erkannt werden kann.


Anmelden zum Antworten