C++ 클래스 구조 설계 관련 질문


라이브러리를 하나 작성하고 있습니다.
c++을 오래 했음에도 아직 디자인패턴에 익숙하지 않아 부끄럽네요.
지금 제가 만난 문제를 그림으로 표현하자면
구조.
이런 상황에서 ConcreteReceiver가 receive함수의 호출로부터 받는 data를 가지고
ConcreteData만이 가지는 필드에 접근해서 값을 얻는 방법을 모르겠습니다.
(그러니까 음... getData를 통해서 다른 타입의 값을 얻고 싶습니다)
강제 캐스팅으로 가능하기는 하지만 최대한 방법을 찾아봐야겠다고 생각해서
질문드립니다.

이전에 책에서 읽는 바로는
다형성을 두번 일으키는 방법으로 뭔가 가능하다고 얼핏 기억이 나는데
까마귀 고기를 좋아해서 까먹었습니다...

부탁드립니다 ㅠㅠ

  • 2016년 04월 03일에 작성됨
    AI, Game, Simulation 코드작성을 좋아합니다.

조회수 354


1 답변


좋아요
1
싫어요
채택취소하기

template을 사용하는건 어떨까요?

  • 2016년 04월 03일에 작성됨

  • 템플릿을 어디에 사용하라는 말씀이신가요?    NeuroWhAI   2016.4.3 21:12     
  • Data 클래스를 template으로 작성하시면 가능하지 않을까요? https://code.google.com/p/chromium/codesearch#chromium/src/content/public/browser/notification_details.h&sq=package:chromium&type=cs    고상우   2016.4.3 21:13     
  • Chromium에서 Notification의 디테일 정보로 여러 타입을 저장해 전달하기 위해 사용하는 코드입니다. 원하시는 바가 비슷하지 않을까 싶습니다.    고상우   2016.4.3 21:14     
  • 하지만 그렇게하면 한 receive함수가 Data(int)나 Data(float) 둘다 받을 수는 없게 되지않나요?    NeuroWhAI   2016.4.3 21:15     
  • 일단 답변 감사드리니 채택..    NeuroWhAI   2016.4.3 21:24     
  • 위의 링크의 코드 처럼 작성하게 되면 받을 수는 있겠지만 원하시는 것처럼 캐스팅을 완벽히 피하지는 못하겠네요 :(    고상우   2016.4.3 21:27     
  • 하나 궁금한 것이 있습니다만, Receiver가 기대고 있는 Data의 구체 클래스에 대해 알아야 한다는 점은 디자인 패턴에서 피하려고 노력하는 부분 중 하나인데요, 그 타입을 꼭 Receiver가 꼭 알아야하는 것인가요? 아니면 ConcreateData가 직접 처리후에 넘겨 줄 수 있는 부분인가요?    고상우   2016.4.3 21:31     
  • 탬플릿을 이용한 다형성과 virtual 메소드 상속을 이용한 다형성은 서로 잘 섞이지가 않아서, 같이 쓰기가 쉽지 않습니다. 가상 함수 테이블 자체가 런타임에 결정하는 거라서, 이런 경우는 그냥 data 에 데이터 형에 대한 정보를 저장하고 static_cast ( void 포인터를 쓸경우) 혹은 dynamic_cast(템플릿을 쓸경우) 를 쓰는게 제일 좋은 방법일 것 같습니다. 아니면 data 와 reciever 를 모두템플릿 화하는 것이 가능한데, 이경우는 전체 디자인에 변경이 필요할 가능성이 크죠.    paul9   2016.4.6 19:16     
  • @paul9 님 말씀이 맞습니다. receiver도 템플릿 파라미터를 받거나, data 쪽이 템플릿이니 static_cast를 수행해서 돌려주는 메서드를 data쪽에서 제공하는 방법을 생각하고 있었습니다.    고상우   2016.4.7 12:50     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close