Неполный тип для переменной - хотя я думал, что правильно объявил пересылку?

0

Код, скомпилированный до того, как я попытался передать этот класс ссылкой в другой класс. Вы можете игнорировать тот факт, что я использую QT.

Я добавил все файлы, затронутые для полноты.

Поэтому я подумал, что у меня есть передовые декларации. Вот ошибка, которую я получаю, что указывает, что компилятор недоволен выражением о переходе:

error: field m_systemController has incomplete type
           SystemController m_systemController;

Вы можете видеть переменную, которую она изматывает в нижней части.cpp:

Это startup.h:

#pragma once
#include <QObject>

namespace GUI{
    class SetupTab; //Should have my forward declarations in order
    class CbcRegistersTab;
    class DataTestTab;

    class MainView;

    class Settings;

    class SystemController;

    class DataTest;
    class SetupTabViewManager;


    class Startup : public QObject
    {
        Q_OBJECT
    public:
        explicit Startup();
        void show() const ;

        ~Startup();
    private:
        SetupTab& m_setupTab;
        CbcRegistersTab& m_regTab;
        DataTestTab& m_dataTab;

        MainView& m_mainView;
        Settings* m_settings;

        SystemController& m_systemController;

        DataTest& m_dataTest; 

        SetupTabViewManager* m_setupTabVm;

        explicit Startup(const Startup& rhs) = delete;
        Startup& operator= (const Startup& rhs) = delete;
    };
}

Это начало startup.cpp:

#include "startup.h"
#include "View/setuptab.h"
#include "View/cbcregisterstab.h"
#include "View/datatesttab.h"
#include "View/mainview.h"
#include "Model/settings.h"
#include "Model/systemcontroller.h"
#include "Model/datatest.h"
#include "ViewMgr/setuptabviewmanager.h"
#include "provider.h" 

namespace GUI
{
    Startup::Startup() :
        QObject(nullptr),
        m_setupTab(*new SetupTab(nullptr)),
        m_regTab(*new CbcRegistersTab(nullptr)),
        m_dataTab(*new DataTestTab(nullptr)),

        m_mainView(*new MainView(nullptr,
                                 m_setupTab,
                                 m_regTab,
                                 m_dataTab)),

        m_systemController(*new SystemController(nullptr,
                                                 Provider::getSettingsAsSingleton())),

        m_dataTest(*new DataTest(nullptr,
                                m_systemController)), //so it this part I'm having trouble with

        m_setupTabVm(new SetupTabViewManager(this,
                                             m_setupTab,
                                             m_systemController,
                                             Provider::getSettingsAsSingleton() ))

Затем я просто передаю это значение в свой файл datatest.h и привяжу его к переменной через ссылку:

#pragma once
#include <QObject>

namespace GUI{

    class SystemController;

    class DataTest : public QObject
    {
        Q_OBJECT
    public:
        explicit DataTest(QObject *parent,
                          SystemController& sysCtrl);

        void runTest();

    private:

        SystemController m_systemController;

        explicit DataTest(const DataTest& rhs) = delete;
        DataTest& operator= (const DataTest& rhs) = delete;
    };

}

Затем верхняя часть datatest.cpp:

#include "datatest.h"

#include "Model/systemcontroller.h"

namespace GUI
{
    DataTest::DataTest(QObject *parent,
                       SystemController& sysCtrl) :
        QObject(parent),
        m_systemController(sysCtrl) // FREAKS OUT HERE
    {
    }
  • 0
    Вы можете делать ссылки или указатели на заранее объявленные типы, но вы не можете создавать поля этих типов.
  • 0
    «Неполный тип» означает , что он был объявлен, но не был определен. Он может использоваться только ограниченным образом без определения.
Теги:
forward-declaration

1 ответ

4
Лучший ответ

В datatest.h вас есть следующая переменная-член

SystemController m_systemController;

Поскольку переменная - это экземпляр, вам нужно включить полный include, а не просто объявление вперед.

Вы можете уйти с объявлением вперед, если у вас есть только указатели или ссылки, например

SystemController* m_pSystemController;  // pointer
SystemController& m_rSystemController;  // reference

Вы также можете использовать интеллектуальные указатели с форвардами

std::unique_ptr<SystemController> m_pSystemController;
  • 0
    Спасибо, тоже неплохо объяснил

Ещё вопросы

Сообщество Overcoder
Наверх
Меню