繁体   English   中英

将基类构造函数复制到子类?

[英]Duplicating base-class constructors to subclass?

我有一个大型集合类,需要将其“包装”在一个非常薄的子类中。 基类的功能不变,并且它们的接口保持不变。

问题是,为了使用基类的构造函数(它们中的大多数都具有多个),我需要在每个子类中分解一个相同的构造函数,然后将参数简单地传递给基类的构造函数(99%的时间,我在构建时无事可做)。 这是很多没有意义的工作。

最简单的方法是什么?

编辑:即使语言本身不支持它,也许有些工具可以自动生成该代码?

您可以将所有可能参数的模板化构造函数添加到包装类:

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;
}

在某些极端情况下,这种方法可能会导致问题,但是对于简单情况,它是可行的。

我认为除非您可以使用C ++ 0x,否则您很不走运。 阅读本文:

根据父类的构造函数自动创建构造函数(C ++)

一厢情愿的想法促使我提出建议

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 { \

我会选择基于脚本的解决方案,也许基于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工具。 Trolltech 的示例中包含XQuerys。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM