1

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

这是我的函数,它分配内存并使用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' 有没有好的方法解决这个问题?

4

2 回答 2

1

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

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

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

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

于 2012-12-29T13:06:39.987 回答
0

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

于 2012-12-29T13:02:15.640 回答