【问题标题】:placement new and private constructor放置新的和私有的构造函数
【发布时间】:2012-12-29 12:48:18
【问题描述】:

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

这是我分配内存并使用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' 有什么好办法吗?

【问题讨论】:

  • 是否可以选择将分配器声明为好友?
  • 如果没有其他选项是

标签: c++ memory-management placement-new


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2011-04-20
      • 2011-09-13
      相关资源
      最近更新 更多