Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Forward Declaration error
Forum Updated to NodeBB v4.3 + New Features

Forward Declaration error

Scheduled Pinned Locked Moved General and Desktop
26 Posts 4 Posters 20.7k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    stima_ua
    wrote on last edited by
    #15

    Its example.

    //mainwindow.h
    @
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>

    namespace Ui {
    class MainWindow;
    }

    class MainWindow : public QMainWindow
    {
    Q_OBJECT

    public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    private:
    Ui::MainWindow *ui;
    };

    #endif // MAINWINDOW_H
    @

    //mainwindow.cpp
    @
    #include "mainwindow.h"
    #include "ui_mainwindow.h"

    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);

    //use ui: ui->button->setText("Text");
    

    }

    MainWindow::~MainWindow()
    {
    delete ui;
    }

    @

    --------or-------------
    //mainwindow.h
    @
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>
    #include "ui_mainwindow.h"

    class MainWindow : public QMainWindow, public Ui_MainWindow
    {
    Q_OBJECT

    public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    private:

    };

    #endif // MAINWINDOW_H
    @

    //mainwindow.cpp
    @
    #include "mainwindow.h"

    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
    {
    setupUi(this);

    //use ui: button->setText("Text");
    

    }

    MainWindow::~MainWindow()
    {
    }
    @

    1 Reply Last reply
    0
    • R Offline
      R Offline
      r3willia
      wrote on last edited by
      #16

      [quote author="pragati" date="1337334158"] Using now namespace Ui, still getting error:

      /home/pragati/MultiFuncTester/Components/DMM/Build/../Source/DMM.cpp:14: error: 'class DMM::Ui::DMMMenu' has no member named 'setupUi'[/quote]

      In the example posted by stima_ua, the Ui namespace is being used by the resources framework to generate a Ui::MainWindow class definition. This is the same as in your case - the DMM_ui.h generates a class definition called Ui::DMMMenu - there is nothing called DMM::Ui::DMMMenu defined. However, in your header DMM.h, you have told the compiler that there's a forward declaration for a type DMM::Ui::DMMMenu - you then use this as the type of your pointer with the lines:
      @private:

      Ui::DMMMenu *ui;@
      

      Bear in mind - this is telling the compiler: "I want a pointer of type DMM::Ui::DMMMenu" because you're making this declaration from within the DMM namespace.

      If you want to do your implementation using the UI resources from Qt, you'll need to do your declaration like this:
      @
      namespace Ui {

      class DMMMenu;

      }

      namespace DMM {

      class DMMMenu: public QWidget
      {
      Q_OBJECT

      public:

      explicit DMMMenu(QWidget *parent = 0);
      ~DMMMenu();

      private:

      ::Ui::DMMMenu *ui;
      

      };

      }@

      This tells the compiler that it will receive a full declaration of Ui::DMMMenu later on, and that you want to use Ui::DMMMenu as the type for your ui member pointer in your DMM::DMMMenu class declaration.

      1 Reply Last reply
      0
      • P Offline
        P Offline
        pragati
        wrote on last edited by
        #17

        I did as you guys told

        @
        namespace Ui {

        class DMMMenu;

        }

        namespace DMM {

        class DMMMenu: public QWidget
        {
        Q_OBJECT

        public:

        explicit DMMMenu(QWidget *parent = 0);
        ~DMMMenu();

        private:

        ::Ui::DMMMenu *ui;
        

        };

        }@

        But now the compiler is telling the prototype in dmm.cpp and dmm_ui.h doesnot match

        1 Reply Last reply
        0
        • R Offline
          R Offline
          r3willia
          wrote on last edited by
          #18

          I think that's progress. What's the exact message you're seeing?

          1 Reply Last reply
          0
          • P Offline
            P Offline
            pragati
            wrote on last edited by
            #19

            :).....

            1 /home/pragati/MultiFuncTester/Components/DMM/Build/../Source/DMM.cpp:8: error: prototype for 'Ui::DMMMenu::DMMMenu(QWidget*)' does not match any in class 'Ui::DMMMenu'

            1. /home/pragati/MultiFuncTester/Components/DMM/Build/ui_DMM.h:61: error: candidates are: Ui::DMMMenu::DMMMenu(const Ui::DMMMenu&)

            error: Ui::DMMMenu::DMMMenu()

            1 Reply Last reply
            0
            • R Offline
              R Offline
              r3willia
              wrote on last edited by
              #20

              From the code you've posted of DMM_ui.h, Ui::DMMMenu has no explicit constructor - this means the compiler will have given it an implicit copy constructor of signature Ui::DMMMenu::DMMMenu(const Ui::DMMMenu&) This is the candidate you're seeing.

              Do you still use the Ui namespace in your DMM.cpp file? It looks like the compiler's trying to link DMM::DMMMenu against Ui::DMMMenu!

              Make sure if there's any ambiguity that you remove it by explicitly specifying the name of the type you're using. Is your code in DMM.cpp now looking something like this?
              @
              # include <../Include/DMM.h>
              # include <ui_DMM.h>

              namespace DMM {
               
              DMMMenu::DMMMenu(QWidget *parent) :
                  QWidget(parent),
                  ui(new ::Ui::DMMMenu)
              {
                  ui->setupUi(this);
              }
               
              }@
              
              1 Reply Last reply
              0
              • P Offline
                P Offline
                pragati
                wrote on last edited by
                #21

                I did changed to Namespace DMM...but prob is I have to create an instance of this DMM in other directory class like this:
                Start.h
                @
                #ifndef START_H
                #define START_H

                #include "../../DMM/Include/DMM.h"

                /****************************************************************************/
                /**

                • \brief This class handles the initialization of the user interface.
                  /
                  /
                  ***************************************************************************/
                  namespace Start {

                class Startup : public QObject
                {
                Q_OBJECT

                public:
                Startup();
                virtual ~Startup();
                void GuiInit();

                private:

                Ui::DMMMenu *MainWindow;

                };

                }

                #endif // START_H
                @

                Start.cpp:

                @

                #include "../../Start/Include/Start.h"

                namespace Start {

                Startup::Startup() : QObject()
                {
                
                // GUI components
                
                MainWindow = new DMM::DMMMenu();
                

                }

                Startup::~Startup()
                {
                try {
                // GUI Components

                    delete MainWindow;
                }
                catch (...) {}
                

                }

                /***************************************************************************/
                /
                !

                • \brief Initializes the user interface
                  /
                  /
                  ***************************************************************************/
                  void Startup::GuiInit()
                  {
                  MainWindow->show();

                }

                }

                @

                So now I am getting errors like these upon changing namespace to DMM:

                1. /home/pragati/MultiFuncTester/Components/Start/Build/../Source/Start.cpp:-1: In constructor 'Start::Startup::Startup()':

                /home/pragati/MultiFuncTester/Components/Start/Build/../Source/Start.cpp:12: error: cannot convert 'DMM::DMMMenu' to 'Ui::DMMMenu*' in assignment*

                2./home/pragati/MultiFuncTester/Components/Start/Build/../Source/Start.cpp:35: error: invalid use of incomplete type 'struct Ui::DMMMenu'

                3./home/pragati/MultiFuncTester/Components/Start/Build/../../DMM/Include/DMM.h:9: error: forward declaration of 'struct Ui::DMMMenu'

                1 Reply Last reply
                0
                • R Offline
                  R Offline
                  r3willia
                  wrote on last edited by
                  #22

                  That's good - it means the compiler's got past the problem you were having before - now you've got the problem that you're using the wrong type for your member of Start::Startup.

                  I expect you want Start::Startup's declaration to read:

                  @class Startup : public QObject
                  {
                  Q_OBJECT

                  public:
                  Startup();
                  virtual ~Startup();
                  void GuiInit();

                  private:

                  DMM::DMMMenu *MainWindow;

                  };@

                  DMM::DMMMenu has a Ui::DMMMenu, but DMM::DMMMenu is not a Ui::DMMMenu (to use Object-orientated is-a / has-a terminology).

                  1 Reply Last reply
                  0
                  • P Offline
                    P Offline
                    pragati
                    wrote on last edited by
                    #23

                    :(

                    I used it already before but as soon as I do this:
                    @DMM::DMMMenu *MainWindow;
                    @
                    I get error that
                    1./home/pragati/MultiFuncTester/Components/Start/Build/../../Start/Include/Start.h:27: error: 'DMM' does not name a type

                    and

                    2./home/pragati/MultiFuncTester/Components/Start/Build/../Source/Start.cpp:35: error: 'MainWindow' was not declared in this scope

                    1 Reply Last reply
                    0
                    • R Offline
                      R Offline
                      r3willia
                      wrote on last edited by
                      #24

                      You're referencing DMM from within the namespace Start; it's possible you may have to be specific i.e. declare the parameter:
                      @::DMM::DMMMenu *MainWindow;@

                      Also make certain that "../../DMM/Include/DMM.h" does indeed define DMM::DMMMenu.

                      1 Reply Last reply
                      0
                      • P Offline
                        P Offline
                        pragati
                        wrote on last edited by
                        #25

                        r3Willia,

                        I am still getting errors but not regarding this....anyways thank you so much...you came when I was not getting help from anyone....Thank you so much....wish I cud have personally thanked you...bt anyways....all the best and again ty....

                        1 Reply Last reply
                        0
                        • P Offline
                          P Offline
                          pragati
                          wrote on last edited by
                          #26

                          hi...

                          Everything is working fine until when I write in main. In main I included one of the subdirectory's .h file and wrote some function like this I am posting here both the codes of main and that directory....

                          Error I am getting is :

                          /home/pragati/MultiFuncTester/Components/Main/Source/Main.cpp:-1: error: undefined reference to `Start::Startup::Startup()'

                          /home/pragati/MultiFuncTester/Components/Main/Source/Main.cpp:-1: error: undefined reference to `Start::Startup::GuiInit()'
                          /home/pragati/MultiFuncTester/Components/Main/Source

                          /Main.cpp:-1: error: undefined reference to `Start::Startup::~Startup()'

                          Similiar error for GuiInit....

                          Start.h

                          @
                          #ifndef START_H
                          #define START_H

                          #include "../../DMM/Include/DMM.h"

                          /****************************************************************************/
                          /**

                          • \brief This class handles the initialization of the user interface.
                            /
                            /
                            ***************************************************************************/
                            namespace Start {

                          class Startup : public QObject
                          {
                          Q_OBJECT

                          public:

                          Startup();
                          virtual ~Startup();
                          void GuiInit();

                          private:

                          DMM::DMMMenu *MainWindow;

                          };

                          }

                          #endif // START_H

                          @

                          Start.cpp

                          @

                          #include "../../Start/Include/Start.h"
                          namespace Start {

                          Startup::Startup() : QObject()
                          {

                          // // GUI components

                          MainWindow = new DMM::DMMMenu();

                          }

                          /***************************************************************************/
                          /
                          !

                          • \brief Initializes the user interface
                            /
                            /
                            ***************************************************************************/
                            void Startup::GuiInit()
                            {
                            MainWindow->show();

                          }

                          }
                          @

                          Main.cpp

                          @
                          #include "../../Start/Include/Start.h"
                          #include <QApplication>
                          #include <QtGui>

                          int main(int argc, char *argv[])

                          {
                          QApplication app(argc, argv);
                          Start::Startup start;
                          start.GuiInit();
                          return app.exec();
                          }

                          @

                          1 Reply Last reply
                          0

                          • Login

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved