2012-12-29 64 views
1

我有一個使用放置新的自定義內存分配器。然後我有一個具有私有構造函數的類,當我嘗試使用我的內存分配器時,它抱怨構造函數是私有的。放置新的和私人的構造

這裏是我的功能分配內存,並採用放置新的要求構造:

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

正在申報分配器爲朋友的選擇嗎? – jogojapan

+0

如果沒有其他選擇是的 – KaiserJohaan

回答

1

選項1:使自定義分配器成爲您班級的朋友。

選項2:委託在定製分配到非成員函數的實際分配工作,並作出具體的非成員函數類的朋友。

選項2B:在委託定製分配到非成員函數的實際分配工作,並專注非成員函數調用Mesh::InitializeMesh(或你有什麼),而不是Mesh::Mesh

選項3:創建一個AllocateObject的版本,該版本還需要一個初始化函數,允許調用方傳入如何初始化內存塊。默認的初始化函數會使用任意數量的參數和調用放置。你在這種情況下通過的可能會做同樣的事情(但是成爲這個類的朋友),或者它可能是一個指向某種靜態方法的指針,或者你有什麼。

0

使用私有構造的典型情況是類的設計者不希望類的「典型」建設。在這種特殊情況下,這個類的所有者似乎希望你使用Mesh :: CreateMesh - 也許你可以修改它直接使用你的分配器 - 而不是通過模板?