簡體   English   中英

放置新的私有構造函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM