我有一组从对象公共基础派生的对象,。我需要能够在一个单独的数据结构中注册所有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
目前,它以某种方式unelegant完成 - 新的运营商那里的对象之前分配额外的字节,并存储为L指针,与其他一些数据来描述对象类型一起。基类然后通过init函数接收到一个指向这个'元数据'的指针。否则,首先想到的是虚函数,但它们不能从构造函数中调用,所以我不得不注册基指针,但只在稍后的时间点调用虚函数,而我我不确定这比我目前的实施更漂亮。
你想对实际地址做什么? –
@JoachimPileborg“这在派生和基础对象中都是一样的”---不,不是真的。 –
@JoachimPileborg这不会是基类和派生类中的相同物理地址。 –