размещение нового и частного конструктора

У меня есть собственный распределитель памяти, который использует размещение нового. Затем у меня есть класс с закрытым конструктором, и когда я пытаюсь использовать распределитель памяти, он жалуется на то, что конструктор является закрытым.

Вот моя функция, которая выделяет память и вызывает конструктор, используя размещение 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

Решение

Вариант 1. Сделайте пользовательский распределитель другом вашего класса.

Вариант 2: делегируйте фактическое задание выделения в пользовательском распределителе функции, не являющейся членом, и сделайте эту конкретную функцию, не являющуюся членом, другом вашего класса.

Вариант 2b: делегировать фактическое задание выделения в пользовательском распределителе функции, не являющейся членом, и специализировать функцию, не являющуюся членом, для вызова Mesh::InitializeMesh (или что у тебя) вместо Mesh::Mesh,

Вариант 3: Создать версию AllocateObject это также принимает функтор инициализации, позволяющий вызывающей стороне передать, как должен быть инициализирован блок памяти. Функтор инициализации по умолчанию будет принимать любое количество аргументов и размещать вызовы новыми. Тот, который вы передадите в этом случае, может сделать то же самое (но быть другом класса), или это может быть указатель на некоторый статический метод в Meshили что у тебя.

1

Другие решения

Типичным случаем использования частного конструктора является то, что конструктор класса не хочет «типичной» конструкции класса. В этом конкретном случае может показаться, что владелец класса хочет, чтобы вы использовали Mesh :: CreateMesh — может быть, вы могли бы просто изменить это, чтобы использовать ваш распределитель напрямую, а не через шаблон?

0

По вопросам рекламы [email protected]