我有一组从公共基础派生的对象,ApiObject
. 我需要能够在一个单独的数据结构中注册所有 ApiObjects,但我需要有一个正在创建的对象的实际地址,而不是基类(我正在使用多重继承)。
我不能把注册对象的代码放到ApiObject
构造函数中,因为它不知道派生对象的地址;我也不能把它放在派生类的构造函数中,因为我们无法知道我们是否真的在构造另一个派生类(例如,如果类B
继承自A
,并且两者都可以构造)。
所以我看到的唯一选择是每次创建对象时显式调用注册函数,如
B* b = new B(...);
RegisterObject(b);
但是,这似乎不是一个很好的解决方案,因为我必须记住每次都调用这个函数。
我想我应该提供更多背景信息来解释我为什么要这样做。对象是通过重载的 new 运算符创建的,它需要对象知道它创建的上下文(Lua 状态)。例如
Foo* object = new(L) Foo(...);
// Foo is derived from ApiObject, and we want ApiObject to have a reference to L
目前它以一种不太优雅的方式完成 - new 运算符在对象之前分配额外的字节并将 L 指针存储在那里,以及一些额外的数据来描述对象类型。然后,基类通过 init 函数接收指向此“元数据”的指针。
否则,首先想到的是虚函数,但它们不能从构造函数中调用,所以我必须注册基ApiObject
指针,但只能在以后调用虚函数,而我不是确定这比我当前的实现更漂亮。