gpt4 book ai didi

c++ - 我可以在构造函数调用之前设置成员变量吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:15:34 27 4
gpt4 key购买 nike

我开始实现一个基于 ID 的内存池,其中每个元素都有一个 ID,它基本上是 vector 中的一个索引。在这种特殊情况下,我在构造对象本身之前就知道索引,所以我认为我在调用构造函数之前设置了 ID。

一些细节

从基于 ID 的池中分配对象如下:

  1. 从池中分配一个空闲id
  2. 根据id值获取内存地址
  3. 在内存地址构造对象
  4. 设置对象的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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com