放置新建和私有构造函数

时间:2012-12-29 12:48:18

标签: c++ memory-management placement-new

我有一个使用placement new的自定义内存分配器。然后我有一个有私有构造函数的类,当我尝试使用我的内存分配器时,它会抱怨构造函数是私有的。

这是我的函数,它使用placement new分配内存并调用构造函数:

template <class T, typename arg0>
inline T* AllocateObject(arg0& a0) { return new (InternalAllocate(sizeof(T))) T(a0); }

这是我要分配的课程:

/* MeshPtr definition */
   typedef boost::shared_ptr<Mesh> MeshPtr;

/* Mesh defintion */
    class Mesh
    {
    public:
        static MeshPtr CreateMesh(IVertexBuffer* vertexBuffer);
        ~Mesh();

        IVertexBuffer* GetVertexBuffer();


    private:
        Mesh(IVertexBuffer* vertexBuffer);

        IVertexBuffer* mVertexBuffer;
    };


 MeshPtr Mesh::CreateMesh(IVertexBuffer* vertexBuffer)
    {
        return MeshPtr(HeapAllocator::GetDefaultHeapAllocator().AllocateObject<Mesh>(vertexBuffer), boost::bind(&HeapAllocator::DeallocateObject<Mesh>, &HeapAllocator::GetDefaultHeapAllocator(), _1));
    }

如上所述,错误为error C2248: 'Mesh::Mesh' : cannot access private member declared in class 'Mesh' 这有什么好办法吗?

2 个答案:

答案 0 :(得分:1)

选项1:使自定义分配器成为您班级的朋友。

选项2:将自定义分配器中的实际分配作业委派给非成员函数,并使该特定非成员函数成为您班级的朋友。

选项2b:将自定义分配器中的实际分配作业委派给非成员函数,并专门化非成员函数来调用Mesh::InitializeMesh(或者你有什么),而不是Mesh::Mesh

选项3:创建AllocateObject的版本,该版本也采用初始化函数,允许调用者传入内存块的初始化方式。默认初始化函数将采用任意数量的args并调用placement new。你在这种情况下传入的那个可能会做同样的事情(但是成为该类的朋友),或者它可能是Mesh中某个静态方法的指针,或者你有什么。

答案 1 :(得分:0)

使用私有构造函数的典型情况是类设计者不希望类的“典型”构造。在这种特殊情况下,似乎该类的所有者希望您使用Mesh :: CreateMesh - 也许您可以修改它直接使用您的分配器 - 而不是通过模板?