【发布时间】:2021-08-24 05:00:29
【问题描述】:
我正在用 C++ 实现一个事件模板,如下所示
模板.h
template<typename EventArg>
class Event {
public:
typedef void (*EventHandle)(const EventArg&);
vector<EventHandle> EventHandles;
protected:
virtual void Init() { throw EventNotInitialized();};
Event()
{
printf("Event() \n");
Init();
}
};
事件.h
struct E_EventArgs {
string data;
};
class E_Event : public Event<E_EventArgs>
{
public:
static E_Event * Get() {
static auto ins = new E_Event();
return ins;
}
protected:
void Init() override {
printf("E_Event() Init() \n");
}
E_Event() {
Init();
printf("E_Event() \n");
}
};
然后我调用E_Event::Get() 访问E_Event。但这是日志:
Event()
我使用 arm-oe-linux-gnueabi-g++(gcc 版本 6.4.0 (GCC))
为什么E_Event的构造函数没有被调用?
【问题讨论】:
-
为什么你认为
E_Event构造函数没有被调用? (我相信您已经得出了一个毫无根据的结论。)如果您将throw EventNotInitialized();替换为printf("Event() Init() \n");,情况可能会更清楚? -
在您尝试该实验后,请参阅Calling virtual functions inside constructors。
-
正在调用构造函数。您的问题是——
E_Event的构造函数中调用了哪个版本的Init()?惊讶吗? -
@JaMiT 你是对的。抛出发生在构造函数调用之前。
-
@Silver 有了这个新见解(
E_Event的构造函数被调用),你能写一个更准确的问题来更好地代表这种情况吗? (强制性免责声明,即使在我看来不太可能:如果编辑此问题会使当前答案无效,则新版本应该是一个新问题。)