我开始实现一个基于 ID 的内存池,其中每个元素都有一个 ID,它基本上是 vector 中的一个索引。在这种特殊情况下,我在构造对象本身之前就知道索引,所以我认为我在调用构造函数之前设置了 ID。
一些细节
从基于 ID 的池中分配对象如下:
- 从池中分配一个空闲id
- 根据id值获取内存地址
- 在内存地址构造对象
- 设置对象的ID成员
并且释放是基于那个id
这是代码(感谢 jrok):
#include <new>
#include <iostream>
struct X
{
X()
{
// id come from "nothing"
std::cout << "X constructed with id: " << id << std::endl;
}
int id;
};
int main()
{
void* buf = operator new(sizeof(X));
// can I set the ID before the constructor call
((X*)buf)->id = 42;
new (buf) X;
std::cout << ((X*)buf)->id;
}
编辑
我在 boost 沙盒中找到了一个解决方案: sandbox Boost.Tokenmap
最佳答案
Can I set a member variable before constructor call?
不,但是您可以创建一个带有 ID 的基类,该基类在其构造函数中设置 ID(例如,如果无法分配 ID,则抛出异常)。从那个类派生,在派生类进入构造函数的那一刻,ID已经设置好了。您还可以在另一个类中管理 id 生成 - 在某种全局单例中,或者您可以将 id 管理器作为第一个参数传递给构造函数。
typedef int Id;
class IdObject{
public:
Id getId() const{
return id;
}
protected:
IdManager* getIdManager() ...
IdObject()
:id(0){
IdManager* manager = getIdManager();
id = manager->generateId();
if (!id)
throw IdException;
manager->registerId(id, this);
}
~IdObject(){
if (id)
getIdManager()->unregisterId(id, this);
}
private:
Id id;
IdObject& operator=(IdObject &other){
}
IdObject(IdObject &other)
:id(0){
}
};
class DerivedObject: public IdObject{
public:
DerivedObject(){
//at this point, id is set.
}
};
这种东西。
关于c++ - 我可以在构造函数调用之前设置成员变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19081578/