目标:我正在制作一个具有10种样式样式的程序,这些样式样式被实现为从同一样式基本类派生的不同类。 main.cpp根据用户选择的样式来创建样式样式。
问题:
主要如何在不创建太多标题的情况下了解所有样式样式?
ex:如果分开,这些将是文件。
baseclass.h
baseclass.cpp
derivedclass1.h
derivedclass1.cpp
derivedclass2.h
derivedclass2.cpp
derivedclass3.h
derivedclass3.cpp
derivedclass4.h
derivedclass4.cpp
main.cpp
在main.cpp内部:
#include "derivedclass1.h"
#include "derivedclass2.h"
#include "derivedclass3.h"
#include "derivedclass4.h"
这不是太多吗?
有没有一种方法可以只调用1个命名空间,该命名空间包含所有派生类的列表,如unity(以monobehavior派生)?我知道它使用c#,但仍然..
=====思想=====
也许是一个foreach循环,它调用同一基类的所有派生类?还是我应该制作一个main_header.h
所有样式的#include
并包含main.cpp
中的样式?
答案 0 :(得分:0)
包括头文件,而不是.cpp文件。
如果由于某些原因仍需要包含.cpp文件,请执行以下操作:不要(但对于模板,将其重命名为_impl.h等)
改为包含头文件
#include "derivedclass1.h"
#include "derivedclass2.h"
#include "derivedclass3.h"
#include "derivedclass4.h"
如果看起来太多了:将相同的类放在同一个文件中并不是罪过(尽管这种情况很少见):
然后包括:
#include "allderivedclasses.h"
答案 1 :(得分:0)
您主要关心的问题是“ main
如何了解所有样式样式?”。
答案是工厂函数需要一个模式样式名称(可能还有一些参数)并产生正确的模式样式对象。每个模式样式的实现都负责将其自身注册到工厂,以使main
可以忽略。
有关此技术的详细说明,请参见https://dev.to/fenbf/factory-with-self-registering-types--35h1
在下面的代码中,PatternStyle
类公开了两个静态函数:
register_pattern
:每个子类都可以在启动时将其名称和静态构造函数注册到std::map pattern_styles
中。create
:在std::map
中查找名称,并调用构造函数(如果有)。pattern_style.h
class PatternStyle {
...
public:
using Constructor = std::function<std::unique_ptr<PatternStyle>()>;
static std::unique_ptr<PatternStyle> create(const std::string& name);
static bool register_pattern(const std::string& name, Constructor ctor);
};
pattern_style.cpp
static std::map<std::string, PatternStyle::Constructor> pattern_styles;
std::unique_ptr<PatternStyle> PatternStyle::create(const std::string& name) {
auto it = pattern_styles.find(name);
if (it == pattern_styles.cend())
return {};
else
return it->second();
}
bool PatternStyle::register_pattern(const std::string& name, Constructor ctor) {
pattern_styles[name] = ctor;
return true;
}
这允许子类像这样注册自己:
wavy_pattern_style.h
class WavyPatternStyle : public PatternStyle {};
wavy_pattern_style.cpp
static bool registration = PatternStyle::register_pattern("wavy", std::make_unique<WavyPatternStyle>);
注意:这种make_unique
的使用需要C ++ 14。如果只有C ++ 11,则需要制作专用的构造函数(或使用lambda)。
使用这种结构,只需在单独的文件中定义模式样式并将其包含在构建系统中即可,这很容易解决