2016-07-26 9 views
0

파생 클래스의 포인터에 대한 참조 (또는 가능한 경우 포인터)를 기본 클래스 A에 갖고 싶습니다. 이 같을 것이다 : 나는 BaseClassController에 다음에 무엇을하고 싶은 무엇파생 클래스의 포인터에 대한 기본 클래스 참조

BaseDataClass 
{ 
    void doSomething(); 
} 

DerivedDataClassA : public BaseDataClass 
{ 
//... 
} 

DerivedDataClassB : public BaseDataClass 
{ 
//... 
} 

은 다음과 같습니다 : 데이터 클래스의 존재와

BaseClassController 
     { 
      public : 
      //Constructors, destructor,... 

      protected : 
      BaseDataClass *& m_current; 
     } 

DerivedClassAController : public BaseClassController 
    { 
     public : 
     //Constructors, destructor,... 

     protected : 
     DerivedDataClassA * m_currentA; 
    } 

DerivedClassBController : public BaseClassController 
    { 
     public : 
     //Constructors, destructor,... 

     protected : 
     DerivedDataClassB * m_currentB; 
    } 

BaseClassController::someFunction(){ 
    m_current->doSomething(); 
} 

문제가 있다는 것입니다 m_currentA 및 m_currentB가 가리키는 객체는 프로그램의 수명을 통해 많은 변화를 가져올 것이고, m_current 참조가 deriv ed 클래스 포인터가 변경됩니다. 이 같은

DerivedClassAController::changerCurrentA(DerivedDataClassA* ptA){ 
    m_currentA = ptA; 
} 

을하지 : Concretly, 나는 다음과 같이 할 m_currentA가 가리키는 객체를 변경하는 기능을 원하는

DerivedClassAController::changerCurrentA(DerivedDataClassA* ptA){ 
    m_currentA = ptA; 
    m_current = ptA; 
} 

내가 파생 클래스 생성자에서 포인터를 전달하여 시도 :

BaseClassController::BaseClassController(BaseDataClass* pt) 
: m_current(pt) 
{ 
} 

DerivedClassAController::DerivedClassAController() 
: BaseClassController(m_currentA), 
    m_current(A) 
{ 
} 

하지만 결국 m_current가 DerivedClassAController의 DerivedDataClassB를 가리키게되었습니다.

가요? 아니면 더 좋은 방법이 있을까요?

참고 : DerivedClassAController는 m_currentA를 DerivedDataClassA로 사용합니다 (95 %의 시간). 기본 클래스에서 m_current 포인터 만 사용하면 어디에서나 dynamic_cast (m_current)를 넣을 수 있습니다.

+0

'다형성'- 사용해 보셨습니까? 'm_current' 포인터를 통해 필요한 모든 것을 할 수 있습니까? – LogicStuff

+4

'BaseClassController'에서'Virtual BaseDataClass * GetCurrent() = 0;'을 호출하고 두 개의 파생 컨트롤러가이를 구현하고 각각'm_currentA' 또는'm_currentB'의 현재 값을 리턴하도록합니다. –

+0

LogicStuff - 내가 왜 그런지 설명 할 수없는 메모를 추가했습니다. 이고르 - 그럴 수 있습니다! 나는 시도 할 것이다. 그러나 내가 시도한 방식대로 작동하는지 알고 싶습니다. – ElevenJune

답변

1

나는 접근 방법을 다음은 일 것이라고 생각 대신 멤버 참조를 사용하는 포인터의 복사본을 반환 BaseClassController에서 가상 함수를 만들 :

struct BaseClassController { 
    virtual BaseDataClass* m_current() = 0; 

을 그리고 각 파생 컨트롤러 다르게 구현 :

BaseDataClass* DerivedDataClassA::m_current() { 
    return m_currentA; 
+0

... 가능할 때마다 * 해당 포인터를 사용하는 코드 **를 ** 객체 자체 또는 부모 (들) 내에 넣으십시오. 그러면 반환 할 필요가 없습니다. 포인터. 그런 식으로, "나는 응용 프로그램의 소스 코드 전체를 돌아 다니지 않아도된다."특정한 것을 조작하는 모든 방법을 발견한다. 괜찮습니다. "그리고 뭔가를 변경해야한다면 (한 번, 바로 여기에서) 변경해야 할 필요가 있습니다. –

+0

가능하면 가능합니다. 개발 된 응용 프로그램은 CAD입니다. 컨트롤러는 많은 MVC 디자인 패턴을 사용합니다. 컨트롤러는 포인터를 통해 데이터 클래스를 조작하지만 프로그램의 나머지 부분은 컨트롤러의 기능을 호출합니다. 포인터는 컨트롤러 클래스와 기본 클래스에서 멀리 떨어지지 않습니다. – ElevenJune

관련 문제