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

标签 c++ memory-management c++11

我开始实现一个基于 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/

相关文章:

c++ - 是否可以在 win32 应用程序中嵌入命令提示符?

c++ - stdout 到变量 c/c++

c++ - 将顶点位置从顶点传递到片段着色器 - 仅在使用 Nsight 调试时有效

javascript - 从 Javascript 数组中清除对象

c++ - Windows 精确计时:CreateTimerQueueTimer 或 system_clock::now() 出错?

c++ - 为什么迭代器不依赖于分配器? (也就是说,让迭代器变得可怕不会违反分配器的 typedef 抽象吗?)

c++ - 从自身的 vector 继承的类

c - 获取指针数据的大小

memory-management - docker 容器对 CPU 和内存的运行时限制

C++ 求值顺序