2013-06-07 3 views
0

이 포럼에서 여러 가지 방법으로 질문합니다.하지만 필자가해야 할 일에 대해 알아볼 수있는 가장 좋은 방법은 아직 없습니다. 게시물). 그래서 나는 더 많은 조언을 구하는 것을 기뻐했습니다!기본 클래스에서 파생 클래스로 변경하는 가장 좋은 방법

class MsgBase 
{ 
    public: 
     uint8_t getMsgType(void); 

    protected: // So that derived classes can access the member 
     char _theMsgData[100]; 
} 

class MsgType1 : public MsgBase 
{ 
} 

class MsgType2 : public MsgBase 
{ 
} 

그래서 무슨 일하면 내가 메시지 데이터의 블록을 받아 내 메시지를 작성하는 데 사용할 수 있습니다 :

나는, (생략 대부분의 세부 사항) 같은 것을 메시지 클래스 계층 구조를 가지고있다. 그러나 메시지 유형을 읽을 때까지 작성할 메시지를 알지 못합니다. 그래서 결국 :

MsgBase rxMsg(rxData); 
if (rxMsg.getMsgType() == 1) 
{ 
    // Then make it a MsgType1 type message 
} 
else if (rxMsg.getMsgType() == 2) 
{ 
    // Then make it a MsgType2 type message 
} 

이것은 내가 붙어있는 비트입니다. 내가 읽은 것으로부터, 나는 기초로부터 파생에 이르기까지 역동적 인 캐스트를 할 수 없다.

if (rxMsg.getMsgType() == 1) 
{ 
    // Now use the same data to make a MsgType1 message. 
    MsgType1 rxMsg(rxData); 
} 

가 나는 그것의 유형을 결정 할 수 있도록 내가 기본 클래스로 데이터를 볼 수있는 방법이 있나요 : 그래서 내 현재 옵션은 (비효율적 인 것 같다) 완전히 새로운 파생 유형, 즉 인스턴스를하는 것입니다 그런 다음 그것을 "파생 된 유형"으로 변형시킵니다.

감사합니다, 사료

+0

'getMsgType'은 어떻게 작동합니까? – asaelr

+0

(모든 유형의) 클래스를 인스턴스화하면 데이터는 기본 클래스 멤버 char _theMsgData []에 저장됩니다. 그런 다음 getMsgType은 메시지 유형 값을 포함하는 특정 요소를 읽고 정수를 리턴합니다. 예를 들어 그 구현은 다음과 같을 수 있습니다 : return _theMsgData [1]; –

+0

모든 관련 정보는'rxData' 변수에있는 것 같습니다. 따라서 타입 정보는'rxData'에 문의하십시오. – MWid

답변

1

rxData은 무엇입니까? 난 그냥 데이터의 방울이라고 가정하고 메시지 형식을 확인하기 위해 구문 분석해야 전에 메시지 개체를 만듭니다. 메시지 데이터가 항상 같은 길이인지 여부에 따라 std::array 또는 std::vector을 사용하여 데이터 blob을 전달해야합니다.

typedef std::vector<char> MsgDataBlob; 

class MsgBase 
{ 
    public: 
     uint8_t getMsgType(); 
     MsgBase(MsgDataBlob blob) : _theMsgData(std::move(blob)) {} 

    protected: // So that derived classes can access the member 
     MsgDataBlob _theMsgData; 
}; 

//derived classes here... 

//this could be either a free function or a static member function of MsgBase: 
uint8_t getMessageType(MsgDataBlob const& blob) { 
    // read out the type from blob 
} 

std::unique_ptr<MsgBase> createMessage(MsgDataBlob blob) { 
    uint8_t msgType = getMessageType(blob); 
    switch(msgType) { 
    case 1: return make_unique<MsgDerived1>(std::move(blob)); 
    case 2: return make_unique<MsgDerived2>(std::move(blob)); 
    //etc. 
    } 
} 
+0

흠 ... 나는 당신이 거기에서하고있는 것을 좋아한다. 나는 그것을 풀어주고, 당신에게 감사 할 것이다. :) (그렇다. 당신의 가정은 정확하다 ... 단지 얼룩진 ... 롤) –

+0

공장 방법 패턴, 당신이 그것을보고 싶을 수도 있습니다;) –

+0

오, 예 :) 나는 공장으로 그것을 식별하지 못했습니다, 나는 그것에 대해 모두 잘못되고있다! 그 덕분에, 대단히 감사합니다. –

0

당신은 메시지가 데이터를 반환하려면하지만, 예를 들어 MsgType1 그것을 모두 소문자을해야하고, MsgBase 호출에 MsgTyp2 모두 대문자로는, 예를 들어, 가상 함수를 만들 수

virtual char *getData(); 

이 함수는 자식 클래스에서 다시 구현되어야 원하는 작업을 수행 할 수 있습니다. 이 방법으로 기본 클래스 포인터에서이 함수를 호출하면 호출 할 때 실제 포인터의 유형에 따라 다시 구현 된 기능이 제공됩니다.

+0

흥미 롭습니다. 답장을 보내 주셔서 감사합니다. 하지만 그게 내 경우 간단하지 :) –

관련 문제