2013-07-02 1 views
1

입력 매개 변수에 따라 유형이 다른 객체를 작성하려고합니다. 예 : 내 목적은 입력 '과정'과 2, 5 (포함) 사이의 런타임시의 정수라고하며 뭔가이 같은 비트가 일어날 것 : 분명히C++의 입력 매개 변수에 따라 클래스에 속한 객체 만들기

if (input == 2) TwoJ process; 
if (input == 3) ThreeJ process; 
if (input == 4) FourJ process; 
if (input == 5) FiveJ process; 

위 작동하지 않습니다 개체가 범위를 벗어나 있기 때문에 바로. 이것을 멋지게 구현할 수있는 방법이 있습니까? 건배

답변

8

smart pointerProcess 클래스로 되 돌리고 그 구현은 공장 기능에 제공된 정수 값으로 결정됩니다 (모든 클래스는 공통 기본을 가져야 함). 예를 들어

:

class Base_process 
{ 
public: 
    virtual ~Base_process() {} 
    virtual void do_something() = 0; 
}; 

class TwoJ : public Base_process 
{ 
public: 
    void do_something() {} 
} 
class ThreeJ : public Base_process 
{ 
public: 
    void do_something() {} 
} 

std::unique_ptr<Base_process> make_process(int a_type) 
{ 
    if (a_type == 1) return std::unique_ptr<Base_process>(new TwoJ()); 
    if (a_type == 2) return std::unique_ptr<Base_process>(new ThreeJ()); 

    // Report invalid type or return an acceptable default if one exists. 
    throw std::invalid_argument("Unknown type:" + std::to_string(a_type)); 
} 
+0

그래서 기본 클래스는 실제로 필요한 모든 것을 수행 할 필요가 없습니다. 실제 클래스를 모두 사용할 수 있어야합니다. – JMzance

+0

@JackMedley, 네. 모든 필수 클래스가 구현해야하는 인터페이스를 정의합니다. – hmjd

+0

좋아, 그걸 만들었고 그걸로 괜찮은 것 같아! 큰! 다른 하나의 관련 사항은 다음과 같습니다. 파생 클래스의 메서드에 지금 어떻게 액세스합니까? – JMzance

2

종류의

std::unique_ptr<ProcessType> CreateProcess(int input){ 
    if(input == 2) return std::unique_ptr<ProcessType>(new TwoJ()); 
    ..... 
} 

이 사용하는 다양한 클래스, 여기 ProcessType를 공통 기본 클래스를 가지고, 물론, 가정, 그리고 당신은을 통해 상호 작용에 만족하는 것을의 팩토리 메소드 기본 클래스 포인터.

+0

'ProcessType'은 포인터가 아닌 값에 의해 리턴되어야합니다. 그렇지 않으면 객체를 슬라이스 할 것입니다. – syam

0

당신은, 당신은 그 모든 예를 들어, 1 개 기본 클래스를 필요로 할 수 있습니다

if (input == 2) (TwoJ*)process->someTwoJMethod(); 

또는 사용 dynamic_cast는 기준 :이와

TwoJ* p = dynamic_cast<TwoJ*>(process); 
if(p != 0) { 
    p->someTwoJMethod(); 
} 

당신이 밖으로 이동 된 후에는 개체를 삭제하는 책임을 자신의

Base* process; 

if (input == 2) process = new TwoJ(); 
if (input == 3) process = new ThreeJ(); 

당신이 필요로하는 모든이 그 클래스에 액세스 범위. 이전 답변은 std::unique_ptr을 사용하는 cpp에서 가장 좋은 방법입니다. 객체가 범위를 벗어날 때 자동으로 삭제됩니다.

관련 문제