C ++中的“此声明没有存储类或类型说明符”错误

时间:2019-07-27 23:24:03

标签: c++

我决定以练习的形式在C ++中实现一些设计模式,并创建了某种项目体系结构,但事实是我希望我的模式位于patterns目录和不同文件中。例如,应将SimpleFactoryPattern放在simplefactory.h文件中。代码如下:

class SimpleAutoFactory {
    public:
        SimpleAutoFactory() {};
        ~SimpleAutoFactory() {};
        SharedInterfaces::IAuto *getAutoModel(EModel model) {
            switch (model) {
                case EModel::EFiat:
                    return new SharedModels::Fiat;

                case EModel::ELamborghini:
                    return new SharedModels::Lamborghini;

                case EModel::EMaserati:
                    return new SharedModels::Maserati;

                default: throw CommonExceptions::unknownModelException;
            }
        }
};

然后,我仅将这段代码包含在main.cpp中,然后运行make && make run来编译和执行整个程序。问题是我的linter产生错误,表明它不知道SharedInterfaces命名空间的来源,依此类推。我怀疑项目的结构一定存在问题。 我是C ++的新手,但据我所知,我们仅在标头中声明内容,并在cpps中执行内容。如果导入,那就是在我的simplefactory.cpp文件中包含必需的标头,那么我将面临重新定义错误。 用C ++处理此问题的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

您的头文件应该只包含声明,如下所示:

simplefactory.h:

#pragma once

// here you should also include the header files where your other classes (IAuto, Fiat etc) are declared

class SimpleAutoFactory {
    public:
        SharedInterfaces::IAuto *getAutoModel(EModel model); // only declaration, no definition
};

然后,在cpp文件中定义函数:

simplefactory.cpp:

#include "simplefactory.h"

SharedInterfaces::IAuto *SimpleAutoFactory::getAutoModel(EModel model) {
            switch (model) {
                case EModel::EFiat:
                    return new SharedModels::Fiat;

                case EModel::ELamborghini:
                    return new SharedModels::Lamborghini;

                case EModel::EMaserati:
                    return new SharedModels::Maserati;

                default: throw CommonExceptions::unknownModelException;
            }
        }

然后,您可以将这些文件与主文件一起编译,也可以将这些文件编译为静态或共享库,然后将其传递给链接器。