gpt4 book ai didi

c++ - 放置新的和私有(private)的构造函数

转载 作者:太空宇宙 更新时间:2023-11-04 12:01:08 25 4
gpt4 key购买 nike

我有一个使用 placement new 的自定义内存分配器。然后我有一个具有私有(private)构造函数的类,当我尝试使用我的内存分配器时,它会提示构造函数是私有(private)的。

这是我的函数,它分配内存并使用 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:让自定义分配器成为您类(class)的 friend 。

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

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

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

关于c++ - 放置新的和私有(private)的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14081844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com