我有一个使用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'
这有什么好办法吗?
答案 0 :(得分:1)
选项1:使自定义分配器成为您班级的朋友。
选项2:将自定义分配器中的实际分配作业委派给非成员函数,并使该特定非成员函数成为您班级的朋友。
选项2b:将自定义分配器中的实际分配作业委派给非成员函数,并专门化非成员函数来调用Mesh::InitializeMesh
(或者你有什么),而不是Mesh::Mesh
。
选项3:创建AllocateObject
的版本,该版本也采用初始化函数,允许调用者传入内存块的初始化方式。默认初始化函数将采用任意数量的args并调用placement new。你在这种情况下传入的那个可能会做同样的事情(但是成为该类的朋友),或者它可能是Mesh
中某个静态方法的指针,或者你有什么。
答案 1 :(得分:0)
使用私有构造函数的典型情况是类设计者不希望类的“典型”构造。在这种特殊情况下,似乎该类的所有者希望您使用Mesh :: CreateMesh - 也许您可以修改它直接使用您的分配器 - 而不是通过模板?