同一个基类的多个派生类的C ++优良作法

时间:2019-07-02 11:48:47

标签: c++

目标:我正在制作一个具有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中的样式?

2 个答案:

答案 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)。

使用这种结构,只需在单独的文件中定义模式样式并将其包含在构建系统中即可,这很容易解决