2014-03-31 4 views
0
  1. 두 클래스는 ProcessorData입니다.
  2. Data 일부 데이터를 사용자가 Processor의 공개 메소드에 전달할 수있는 객체이다.
  3. 는 내부적으로 ProcessorData을 기반으로 InternalData 유형을 사용합니다.
  4. Data에서 InternalData으로 개인 변환 기능을 만들고 Processor 안에 다시 코드를 넣고 Data의 인터페이스가 언젠가 바뀔 때 필요한 변경 사항을 지역화하지 않도록하십시오.
  5. 하지만 대신 명시 적의 Processor에서 암시 적으로 이러한 변환을하고 싶습니다.
  6. 이 변환 함수는 Processor 구현에만 사용됩니다.
    외부 세계에 보이지도 액세스 할 수 없어야합니다.
  7. InternalData은 라이브러리 유형입니다. 나는 그것을 제어 할 수 없으며 인터페이스를 수정할 수 없다.
    즉, 변환 생성자 또는 변환 연산자 멤버 함수를 추가 할 수 없습니다.
    원하는 경우 기본 제공 유형으로 간주 할 수 있습니다.
  8. 가 나는 사업이 아니다 이후, 두 Data 클래스 내부에 그 컨버터를 넣어 싶지 않아 그리고 Processor 다른 내부적으로 뭔가로 변환 알지 못한다.

길고도 짧은 이야기, 내가하고 싶은 Processor의 구현은 암시 적으로 DataInternalData 사이에 형식 변환을 만드는 방법을 알고,하지만 다른 Processor 제외하고 아무도 그것을 심지어는 것에 대해 알 수 없어야합니다 Processor의 내부에서 수행됩니다.구현시 자동 유형 변환

C++에서 할 수있는 방법이 있습니까? 솔루션에서

내 시도는

내 첫 번째 시도는 그 private하고, Data의 내부 생성자 및 변환 연산자를 변환하는 것이었다하고 ProcessorDatafriend을하는 것은 그 개인 컨버터에 액세스 할 수 있도록. 그러나 이것은 내가 원하는 것보다 더 많은 작업을 수행합니다 그것은 나쁜 Data의 내부-Processor전체 액세스 권한을 제공합니다.

은 그 때 나는 기능 (컨버터)의 무리가 함께 인터페이스 Data의 종류를 만들 것으로 나타났습니다,하지만 Processor의 사용을 위해해야하는 인터페이스. 그래서 추상적 인 기본 클래스 InternalDataConversions을 만들고이 변환 함수를 pure virtual으로 선언했습니다. 이 수업을 friend (Processor)으로 만들었습니다. 그렇다면 Data 클래스를 개인적으로 파생시켜 이러한 변환기를 구현했습니다. 이렇게하면 Processor은이 "변환 인터페이스"를 내부적으로 사용할 수 있지만 Data 내부의 다른 어떤 것도 액세스 할 수 없으므로 더 좋습니다.
하지만 아래쪽은 이제 Data 클래스가 정의에서 정의하지 않아야하는 부분을 지정해야하며, 불필요하게는 InternalDataInternalDataConversions에 따라 달라 지므로 불편합니다.

더 좋은 아이디어가 있습니까?

+1

TL; 산문은 문법과시 과정에 좋습니다. 프로그래밍 언어 문제는 최소한 의사 코드를 제공해야합니다. 죄송합니다.이 책을 읽을 수는 없습니다. (단순한 적절한 UML 다이어그램조차 1000 개 이상의 단어를 말할 것입니다.) –

+0

독서가 마음에 들지 않으면 다른 곳으로 가십시오. 모든 사람에게 대답 할 필요는 없습니다. 코드는 바로 그 것이다 : 코드. 그것은 내가 필요로하는 것을 당신에게 말하지 않을 것이고, 나의 디자인의 제한은 무엇인가하는 것이다. – SasQ

+0

그냥 내 2cents 비판 (넣어 수 있습니까?), downvote하지 않았다 ... –

답변

0

InternalData에 변환 멤버 함수를 제공 할 수 있습니다. 복사 생성자는 Data 일 수 있으며 변환 연산자는 하나를 다시 생성 할 수 있습니다.

class InternalData 
{ 
public: 
    InternalData(const Data & data); 
    operator Data() const; 
}; 

는 아마도 InternalDataProcessor에 개인이며, 그래서 이것은 인터페이스를 아무런 영향도 미치지 않습니다.

+0

나는 'InternalData' 내 통제하에 있지 않다는 설명을 추가했습니다. 이것은 라이브러리 타입이며,'Processor' 내부에서 사용됩니다. 그래서 나는 단순히 다른 생성자를 추가하거나 변환 멤버 함수를 추가 할 수 없습니다. 어떻게 든이 외부에서 이러한 변환을 수행해야하지만, 'Processor' 클래스 내부에서해야합니다. – SasQ

+0

@SasQ는 귀하의 통제하에있는 '프로세서'입니까? 그렇다면 메소드를 추가하는'InternalData'에서 파생 된 클래스를 사용할 수 있습니다. –

+0

예, '프로세서'는 '데이터'뿐 아니라 제 통제하에 있습니다. 힌트를 가져 주셔서 감사합니다. 'InternalData'는 시스템 정의 된'struct' 일 뿐이므로, 여러분이 제안한대로 그것을 파생시킬 수 있습니다. 비록 이것이 STL이나 내장형 라이브러리 유형과 같은 "파생되지 않은"라이브러리 유형이라면 무엇인지 궁금합니다. – SasQ