我正在使用遗留的框架。可以说'A'是基类,'B'是派生类。这两个类都执行一些关键的框架初始化。 FWIW,它大量使用ACE库。衍生类构造函数问题的依赖关系
我有一种情况,其中; 'B'的一个实例被创建。但'A'的Ctor取决于一些只能从'B'执行的初始化。
正如我们知道'B'实例化时'A'的Ctor在'B'之前被调用。 virtual
机制不能从ctors工作,使用static functions
被排除(由于static-initialization-order-fiasco)。
我认为使用CRTP模式如下: -
template<class Derived>
class A {
public:
A(){
static_cast<Derived*>(this)->fun();
}
};
class B : public A<B> {
public:
B() : a(0) {
a = 10;
}
void fun() { std::cout << "Init Function, Variable a = " << a << std::endl; }
private:
int a;
};
但是,这是在初始化列表中初始化的类成员,因为他们尚未执行(FE“A”在上述情况下未定义的值)。在我的情况下,有很多这样的基于框架的初始化变量。
是否有任何知名的模式来处理这种情况?
由于提前,
更新:
基于由dribeas给出的主意,我唤出行动这一问题的临时解决方案(一个完整的重构呢现在不符合我的时间表)。下面的代码将表现出同样的: -
// move all A's dependent data in 'B' to a new class 'C'.
class C {
public:
C() : a(10)
{ }
int getA() { return a; }
private:
int a;
};
// enhance class A's ctor with a pointer to the newly split class
class A {
public:
A(C* cptr)
{
std::cout << "O.K. B's Init Data From C:- " << cptr->getA() <<
std::endl;
}
};
// now modify the actual derived class 'B' as follows
class B : public C, public A {
public:
B()
: A(static_cast<C*>(this))
{ }
};
有关同一些更多的讨论见c.l.C++米this链接。 Konstantin Oznobikhin给出了一个很好的通用解决方案。
即UB(未定义行为)和一个相当恶劣的伎俩编译器播放。 – 2010-01-12 08:29:01