2017-11-16 7 views
0

나는 런타임 중에 어떤 상위 API를 사용할 것인지 결정하고, 많은 추상 클래스를 가지고 있고, 상위 API마다 파생 클래스와 컨텍스트 클래스를 가지고있다. 이 코드가 덜 추한 것이 가능하다, 그런다형성과 새로운 연산자 [C++]

Mesh* genMesh(data d) { if(m_useA_API) return new A_mesh(d); else return B_mesh(d); } 

뭔가, 지금 질문입니다 :하는 (예를 들어) 함수를 사용하여 작업에 대한 올바른 파생 클래스로 날을 제공? 컨텍스트 클래스 내에서 메서드를 사용하는 대신 기본 클래스에서 new 연산자를 재정 의하여 적절한 파생 클래스 인스턴스를 반환 할 수 있습니까?

그렇지 않은 경우 가능한 해결책은 무엇입니까?

TL; DR이 내가

Mesh* m = new Mesh(data); // and the base class decides which derived class to use instead of the Context class. 

감사를 수행하고 싶은 것입니다.

+0

new 연산자는 원시 저장소 할당을위한 것입니다. 공장 기능을위한 고리가 아닙니다. – StoryTeller

+0

네, 그 이유는 내가 stackoverflow 도움을 왔어, 새로운 메모리 블록을 반환, 나는이 문제에 대한 해결책이 있는지 찾고 있어요. – ABOODYFJ

+1

질문에 대한 해결책은 없습니다. 공장을보다 효과적으로 구현하기위한 다양한 접근법과 디자인 패턴이 있습니다. 그러나 'Mesh * m = new Mesh (data)'가'Mesh '에서 유래 된 어떤 클래스의 인스턴스를 가리키는'm '이되게하는 해결책은 없습니다. 정의에 따르면'new' 표현식은 파생 클래스가 아닌'Mesh' 인스턴스를 생성합니다. – Peter

답변

0

당신은 공장으로 new을 사용할 수 없습니다,하지만 당신은 그것을 구현 패턴을 사용할 수

class Mesh { 
    std::unique_ptr<MeshImpl> _impl; 
public: 
    Mesh(int data) 
    : _impl(
    m_use_A_API 
     ? new A_mesh(data) 
     : new B_mesh(data) 
) { 
    } 
    MeshImpl& get_value() { return *_impl; } 
}; 

클래스 A_meshB_mesh 클래스 MeshImpl에서 상속과 올바른 방법에 의해 초기화됩니다 다른 클래스이다;

또는 당신은 다음의 방법으로하여 공장 코드를 향상시킬 수

  1. Mesh 개인의 클래스 내부 Mesh

  2. 메이크업 생성자를 당신의 방법 genMesh(int)를 이동하기위한 누구도 직접 호출하지 있는지 확인

    .

+0

간단한 해결책을 놓친 것처럼 보입니다! 고마워요! – ABOODYFJ

+2

원시 소유 포인터 대신'std :: unique_ptr'을 사용하십시오. (그래서 당신은 3/5/0 규칙을 깨지 않을 것입니다). – Jarod42

+0

'Mesh '의 생성자가 private 인 경우 파생 클래스 ('A_Mesh' 등)의 인스턴스를 생성 할 수 없습니다. 파생 클래스의 생성은 항상 기본 클래스의 생성자를 호출하거나 호출합니다. 여기에서 접근법을 사용하면 파생 클래스 생성자가 'Mesh (int)'를 호출하면 무한 재귀가 발생합니다. – Peter