简体   繁体   中英

invalid use of incomplete type 'class…'

I've been working on a settings class which can load settings from a file or load default settings if this file not exists. My idea is to have a CSettings class which handles all settings and file queries. And a CDefaultSettings class which stores all the default settings. Both classes must have access to an enum set.

The error i'm getting is:

Settings.cpp: In member function 'std::string CSettings::GetSetting(const CSettings::TProgramSetting&)':
Settings.cpp:6:28: error: invalid use of incomplete type 'class CDefaultSettings'
     return iDefaultSettings->GetDefaultSetting(aProgramSetting);
                            ^

Who can tell me what I'm doing wrong

My files:

main.cpp

#include <iostream>
#include <string>
#include "Settings.h"

int main()
{
    CSettings programSettings;
    std::string setting = programSettings.GetSetting(CSettings::TProgramSetting::Setting1);
    std::cout << setting << std::endl;

    return 0;
}

Settings.h

#include <map>
#include <string>

class CDefaultSettings;

class CSettings
{
    public:
        typedef enum {
            Setting1,
            Setting2,
            Setting3
        } TProgramSetting;

    private:
        CDefaultSettings *iDefaultSettings;

    public:
        std::string GetSetting(const CSettings::TProgramSetting& aProgramSetting);
};

Settings.cpp

#include "Settings.h"

std::string CSettings::GetSetting(const CSettings::TProgramSetting& aProgramSetting)
{
    // As a test, return a default setting
    return iDefaultSettings->GetDefaultSetting(aProgramSetting);
}

DefaultSettings.h

#include <map>
#include "Settings.h"

class CDefaultSettings
{
    public:
        typedef std::map<CSettings::TProgramSetting, std::string> TDefaultProgramSettingCollection;
        TDefaultProgramSettingCollection iDefaultProgramSettingCollection;

    public:
        void LoadDefaultSettings();
        std::string GetDefaultSetting(const CSettings::TProgramSetting& aProgramSetting);
};

DefaultSettings.cpp

#include "DefaultSettings.h"

void CDefaultSettings::LoadDefaultSettings()
{
    iDefaultProgramSettingCollection[CSettings::TProgramSetting::Setting1] = "Default setting 1";
    iDefaultProgramSettingCollection[CSettings::TProgramSetting::Setting2] = "Default setting 1";
    iDefaultProgramSettingCollection[CSettings::TProgramSetting::Setting3] = "Default setting 1";
}

std::string CDefaultSettings::GetDefaultSetting(const CSettings::TProgramSetting& aProgramSetting)
{
    return iDefaultProgramSettingCollection[aProgramSetting];
}

It seems that your Settings.cpp file is missing an #include "DefaultSettings.h"

Also be sure to add include guards a la

#ifndef SETTINGS_H 
#define SETTINGS_H
...
#endif`

Into settings.h (generaly in every header), otherwise it will be included from #include "Settings.h" in settings.cpp and from the include in DefaultSettings.h yielding duplicate definitions.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM