2012-12-29 2 views
1

새로운 배치를 사용하는 사용자 정의 메모리 할당자가 있습니다. 그런 다음 개인 생성자가있는 클래스가 있고 내 메모리 할당자를 사용하려고하면 private 인 생성자에 대해 불만이 제기됩니다.배치 새롭고 개인적인 생성자

언급 한 바와 같이
/* 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' 입니다 : 여기

template <class T, typename arg0> 
inline T* AllocateObject(arg0& a0) { return new (InternalAllocate(sizeof(T))) T(a0); } 

내가 할당하려는 클래스입니다 : 여기

는 메모리를 할당하고 새로운 배치를 사용하여 생성자를 호출 내 기능입니다 이 주위에 좋은 방법이 있습니까?

+0

할당자를 친구로 선택하는 옵션이 있습니까? – jogojapan

+0

다른 옵션이없는 경우 예 – KaiserJohaan

답변

1

옵션 1 : 사용자 정의 할당자를 클래스의 친구로 만듭니다.

옵션 2 : 사용자 지정 할당 자의 실제 할당 작업을 비 멤버 함수에 위임하고 특정 비 멤버 함수를 클래스의 친구로 만듭니다.

옵션 2b : 사용자 지정 할당 자의 실제 할당 작업을 비 멤버 함수에 위임하고 Mesh::Mesh 대신 Mesh::InitializeMesh (또는 무엇을 가지고 있는지)을 호출하도록 비 멤버 함수를 특화하십시오.

옵션 3 : 초기화 함수를 사용하는 AllocateObject 버전을 만들어 호출자가 메모리 블록을 초기화하는 방법을 전달할 수 있도록합니다. 디폴트 초기화 펑터는 args를 얼마든지 취하고 new를 호출 할 것입니다. 이 경우 전달할 클래스는 동일하지만 (클래스의 친구가 될 수도 있음) Mesh의 static 메소드에 대한 포인터 일 수도 있고, 무엇이있을 수도 있습니다.

0

개인 생성자를 사용하는 전형적인 경우는 클래스 디자이너가 클래스의 "일반적인"구성을 원하지 않는다는 것입니다. 이 특별한 경우, 클래스의 소유자가 Mesh :: CreateMesh를 사용하기를 원할 것입니다. 어쩌면 템플릿을 통해 직접 할당자를 직접 사용하도록 수정할 수 있습니다.

관련 문제