我决定以练习的形式在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 ++处理此问题的正确方法是什么?
答案 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;
}
}
然后,您可以将这些文件与主文件一起编译,也可以将这些文件编译为静态或共享库,然后将其传递给链接器。