[英]placement new and private constructor
我有一個使用新位置的自定義內存分配器。 然后,我有一個具有私有構造函數的類,當我嘗試使用內存分配器時,它抱怨該構造函數是私有的。
這是我的函數,它分配內存並使用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'
。
選項1:讓自定義分配器成為您班上的朋友。
選項2:將自定義分配器中的實際分配作業委托給非成員函數,並使該特定的非成員函數成為您的類的朋友。
選項2b:將自定義分配器中的實際分配作業委托給非成員函數,並專門使非成員函數調用Mesh::InitializeMesh
(或您擁有的東西)而不是Mesh::Mesh
。
選項3:創建一個AllocateObject
版本,該版本也帶有一個初始化函子,允許調用者傳遞如何初始化內存塊。 默認的初始化函子將使用任意數量的args並調用new放置。 在這種情況下,您要傳遞的那個可能會做同樣的事情(但是該類的朋友),或者可能是指向Mesh
某個靜態方法的指針,或者您擁有什么。
使用私有構造函數的典型情況是類設計器不需要類的“典型”構造。 在這種情況下,該類的所有者似乎希望您使用Mesh :: CreateMesh-也許您可以修改它以直接使用您的分配器-而不是通過模板?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.