在C ++基类构造函数中注入代码

时间:2010-09-28 08:59:39

标签: c++ constructor

我正在派生一个可以从C ++库中获得的类,我的子类的构造函数只有在基类构造函数被调用之前执行一些代码时才能正常工作。 (是的,我知道,糟糕的设计,但我不能影响我正在使用的图书馆的工作方式。)

如果基类构造函数接受参数,那么这样做实际上非常简单:

struct A {
    A(bool a) { printf("A::A()\n"); }
};

bool inject(bool a) { printf("inject()\n"); return a; }

struct B : public A {
    B(bool a) : A(inject(a)) { printf("B::B()\n"); }
};

现在,当我构造B的实例时,inject()之前会调用A::A()。但是当基类ctor没有参数时,有没有办法做到这一点?

4 个答案:

答案 0 :(得分:5)

您有一个“基于成员初始化”的案例。

解决方案是there

答案 1 :(得分:1)

除了Hacky注入代码之外,我认为合理的方法是执行“has a”而不是“is a”模式:只需在自己的类中包含库类的实例。这样你就可以控制心脏内容的分配和释放顺序。

答案 2 :(得分:1)

你的单参数构造函数的解决方案并没有真正看起来很有用,因为它仍然无法访问正在构造的类(因为它还没有发生)并且不清楚这个hacky是如何做的有用的form(除了可能设置影响基本ctor的全局范围值)。

Stephan提出的解决方案看起来像这样:

struct A {
    A() { printf("A::A()\n"); }
};

struct Injector {
  Injector() { printf("inject()\n"); } 
}

struct B : public A,private Injector {
    B() : Injector(), A() { printf("B::B()\n"); }
};

这是一个好的解决方案,但对我来说似乎有些笨拙。 另一种可能的解决方案是使用静态类函数代替B的构造函数,该函数在返回使用私有构造函数创建的实例化对象之前运行注入,但从您的问题看来,这似乎不适合您的上下文。

答案 3 :(得分:0)

为什么你不能再增加一层?

struct A {
    A(bool a) { printf("A::A()\n"); }
    A();
};

struct A_Wrap : public A {
    A_Wrap(bool ) : A() { } ;
};

bool inject(bool a) { printf("inject()\n"); return a; }

struct B : public A_Wrap {
    B(bool a) : A_Wrap(inject(a)) { printf("B::B()\n"); }
};