我有一个很大的集合类,我需要在一个非常薄的子类中“包装”。基类的功能不会改变,它们的界面保持不变。
问题是,为了使用基类的构造函数(并且大多数都有多个),我需要在每个子类中对相同的构造函数进行十进制,并简单地将参数传递给构造函数基类(99%的时间我在施工时没有别的办法)。这是一项毫无意义的工作。
最简单的方法是什么?
编辑即使该语言本身不支持,也许有一些工具可以自动生成该代码?
答案 0 :(得分:2)
您可以为包装类添加所有可能参数的模板化构造函数:
template<class Base>
class wrapper : public Base {
public:
wrapper() : Base() {}
template<typename T1>
wrapper(T1 a1) : Base(a1) {}
template<typename T1, typename T2>
wrapper(T1 a1, T2 a2) : Base(a1, a2) {}
// ...
};
由于模板不会被实例化为未被调用的构造函数,因此这些其他构造函数是否无效并不重要。只有实际使用的构造函数需要存在于基类中:
class A {
public:
A(int a) {};
};
int main() {
wrapper<A> aw(1);
return 0;
}
可能存在一些极端情况,这种方法会导致问题,但对于简单的情况,它会起作用。
答案 1 :(得分:1)
除非你能使用C ++ 0x,否则我认为你运气不好。阅读这篇文章:
Automatic creation of constructor, based on parent class' constructor (C++)
答案 2 :(得分:0)
class BaseClass {
public:
BaseClass(foo, bar, baz);
};
template <class T>
class BaseInheritor : public BaseClass {
public:
T(foor, bar, baz);
};
class Child : public BaseInheritor<Child> {
// Other stuff
};
我不认为C ++模板可以完全按照我刚刚编写的内容进行操作。宏有一个非常简单的答案,但我觉得很脏:
#define CHILD_CLASS_DEFAULT(name) \
class name : public BaseClass { \
public: name(foo, bar, baz) : BaseClass(foo, bar, baz) { } \
private:
#define CHILD_CLASS_OVERRIDE(name) \
class name : public BaseClass { \
答案 3 :(得分:0)
我会选择基于脚本的解决方案,可能基于gccxml或类似的东西
有了它,您可以编写一个简单的脚本(即generate-derivate <input-file> <base-name> <derivative-name> <output-file>
)来生成包装器。如果要添加/更改功能,则只需手动进行更改。
编辑:模糊的大纲:
write derivative-name + " : public " + base-name + " {\npublic:\n"
foreach <Constructor> where attribute name == base-name
write "\tderivate-name("
foreach <Argument>
resolve by attribute type (query FundamentalType, ReferenceType, ...)
write argument type etc.
write ");\n"
write "\n};\n"
这完全取决于您使用的脚本语言和xml工具。奇趣科技在their example中有XQuerys。