【发布时间】:2018-02-08 01:44:38
【问题描述】:
我有一个看起来像这样的设置
class A
{
virtual void doSomething() = 0;
extern "C" A* getSingleton();
class B {
B() { getSingleton()->doSomething(); }
~B() { getSingleton()->doSomething(); }
};
};
class C : public A
{
static A a;
extern "C" A* getSingleton() { return &C::a; }
void doSomething() { //things }
// also has a container of Bs that will be added to and removed from regularly
}
在析构函数期间会因 '__cxa_pure_virtual' 而崩溃,但不会在构造函数中崩溃。 C::a 在另一个文件中正确定义,为简洁起见
我读过从 ctors/dtors 调用虚函数通常是一个坏主意,但是在这种情况下,它会使 B 的使用更好,所以我有兴趣让它安全地工作。谁能解释为什么 B 的 ctor 设法做这个狡猾的动作,但 dtor 却不能,然后我该如何正确地重做这个?
【问题讨论】:
-
您误解了您阅读的内容。在
A的 c'tor/d'tor 内部调用类A的虚函数本身就是问题(直接或间接)。由于B是一个完全独立的类(它只是在A内部定义),因此在其构造函数中调用A的虚函数没有内在问题。 -
VTC:缺少
C::a和 B 对象的定义,这对于确定执行顺序至关重要。我们无法解释不可见的代码。 -
有一些行之有效的实现单例的方法。这不是其中的一个。使用您选择的搜索引擎找到一个。
-
这段代码想要完成什么?
-
你如何声明一个抽象类的实例?还是有更多代码没有显示?
标签: c++ destructor virtual-functions pure-virtual