c++ - 旧的 c++ 复杂工厂

标签 c++ factory c++03

我需要用 C++03 编写一个工厂,其工作原理如下:

1)创建的元素是对象 block

2) 工厂保存对所有此类子对象的引用。

3) block 是可扩展的

含义:

class Block{
     MemberType member1;
     MemberType member2;
     MemberType member3;
     Block(){...}
}

class Factory{
     set<MemberType*> members1;
     set<MemberType*> members2;
     set<MemberType*> members3;

     Block& makeBlockInstance(){
           Block& currentBlock = *(new Block());

           members1.push_back(&(currentBlock.member1));
           members2.push_back(&(currentBlock.member2));
           members3.push_back(&(currentBlock.member3)); 

           return currentBlock;
     }
}
  • 请不要介意语法错误或小细节,代码是为了表达一个观点。

我需要的是一种从 Block 添加或删除成员的方法,以这样的方式自动创建或删除 set<MemberType*> members# ,以及 members#.push_back(...) .

这可能吗? 这似乎是通过反射完成的,但我想要一些非反射方式来静态地执行此操作。


我很乐意看到一种非预处理器的方式来做到这一点。

在那之前(如果有的话) - 以下是如何使 X 宏扩展成为有条件的 C++ preprocessor conditional parameter

最佳答案

我认为最干净的方法是使用 X Macro实现:

#define MEMBERS \
X(member1)
X(member2)

#define X(m) MemberType m;
MEMBERS
#undefine X

#define X(m) set<MemberType*> m;
MEMBERS
#undefine X

#define X(m) m.push_back(&(currentBlock.m));
MEMBERS
#undefine X

如果您希望成员具有不同的类型,您可以将其更改为:

#define MEMBERS \
X(int, member1)
X(vector<char>, member2)

#define X(t, m) t m;
MEMBERS
#undefine X

#define X(t, m) set<t *> m;
MEMBERS
#undefine X

#define X(t, m) m.push_back(&(currentBlock.m));
MEMBERS
#undefine X

关于c++ - 旧的 c++ 复杂工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31919672/

相关文章:

c++ - 工厂方法创建的对象应该在哪里删除?

java - C++ 与 Java 中的多态性

c++ - MATLAB R2016b - MEX 无法编译 C++ 代码

c++ - 字符串转大写字母函数

c++ - C++ 中的变量自行更改

c++ - 为什么C++线程/future开销这么大

c++ - 在 Visual Studio 2008 上设置预调试事件

c++ - 无需指针(包括智能指针)或拷贝的高效工厂函数?

c++ - std::iterator 的错误指示器

c++ - 如何从枚举类型中获取枚举值?