2013-06-07 4 views
1

일부 데이터의 일반 파서 인 기본 클래스가 있고 파서에 포함 된 데이터에 대한 특정 액세스 인터페이스를 제공하는 여러 파생 클래스가 있습니다. 모든 데이터가 파싱 된 후에 만 ​​파생 클래스의 유형을 결정할 수 있습니다. 이는 파생 클래스가 계층 구조에 따라 다르므로 (각 기본에 대해 파생 클래스를 결정하기 위해 완전히 채워 져야하는 기본 클래스 트리가 있음)기본 클래스 개체에서 파생 클래스 만들기

불필요한 데이터 복사를 피하면서 기본 클래스에서 파생 클래스를 만드는 가장 좋은 방법은 무엇입니까? 지금, 나는 (아래로) 기반의 파생 사용하여 복사 생성자를 만드는거야 :

class Base 
{ 
}; 

class Derived : public Base 
{ 
    Derived(const Base &base) 
    : Base(base) 
    { 
    } 
}; 

을하지만,이 더 필요하지 않습니다 모든 기본 데이터 복사가 필요합니다 - 복사하지 않고 파생 될 수있는 내가 원하는 기본 클래스를하고 가능한 경우 삭제합니다.

EDIT : 파생 클래스 HTE 저장된 실제 데이터의 종류에 따라 특정 액세스 인터페이스를 제공하면서

자료 파서는 일반적> 맵으로 데이터 파일을 저장하고 데이터를 파싱한다. 파생 클래스가 변경 될 수 있으며 더 많이 추가 될 수 있습니다.

+0

아마도'Base'에게 이동 생성자를 줄 수 있고'Derived '도'Base &&'에서 생성 가능하게 만들 수 있습니다. – aschepler

+0

기본에서 파생 된 * 내용을 * 이동해야합니까? – Asha

+1

'Base'와 'Derived'같은 소리가 [Single Responsibility의 원칙]을 위반 함 (http://en.wikipedia.org/wiki/Single_responsibility_principle) –

답변

4

당신은 먼저 모든 데이터를 구문 분석해야한다고 말했고, 질문을하면 Base을 사용하여 구문 분석을 수행한다고 나와 있습니다. (이후 OP 편집으로 확인됩니다.)

그런 다음 구문 분석이 완료되면 Base에서 구문 분석 된 데이터를 기반으로 Derived을 생성합니다. 즉, Derived은 파서 일뿐만 아니라 파싱 된 데이터의 컨테이너 일뿐만 아니라 파싱 된 데이터의 액터이기도합니다. (또한 확인되었습니다.)

데이터를 구문 분석하고 파싱 된 데이터를 모두 포함하며 작동하는 클래스가 하나만있는 경우 Principle of Single Resposibility을 위반합니다. 원리는 깨질 예정 이었지만이 경우 위반하면 문제가 발생한다고 생각합니다.

내 제안은 계층 구조를 해체하는 것입니다.

  • 한 클래스는 파서이며,
  • 한 클래스는 원시 보유 (상태를 분석하기위한 가능성을 제외하고) 그 자체에있는 모든 데이터를 저장하지 않는, 아니 관리 또는 배우의 방법으로 데이터를 분석. 아마도 std::map처럼 간단 할 것입니다.
  • 하나의 클래스가 데이터로 작업을 수행하는 액터입니다. 실제로는 파생 된 데이터의 유형에 따라 다른 클래스가있는 클래스 계층 구조입니다.

    1. 파서를 인스턴스화 :

워크 플로는 다음과 같이 될 것이다.

  • 파서는 원시 데이터의 소유자를 인스턴스화하고 데이터를 구문 분석합니다.
  • 파서는 구문 분석 된 데이터를 기반으로 액터 클래스를 구성하고 shared_ptr을 원시 데이터 컨테이너에 전달합니다.
  • 파서가 종료되어 액터 클래스에 대한 포인터를 반환합니다. 액터 클래스는 이제 원시 파싱 된 데이터를 소유합니다.
  • +0

    edit - parser parses를보고 데이터를 일반적으로 저장하고, 파생 된 데이터에 대한 액세스 인터페이스를 제공합니다 (변형에서 적합한 유형으로 변환) –

    +1

    @IlyaKobelevskiy : '파생 됨'은 'Base'에서 파생 됨 - '파생 됨'을 의미 ** IS -A ** 파서. 그것이 당신의 의도인지의 여부입니다. –

    +0

    그게 좋은 지적이야 ... –

    0

    파생 클래스에 자체 생성자를 제공하고 결정할 데이터 만 구문 분석 할 수 있습니다. 메모리 할당과 관련이 없기 때문에 포인터를 전달하는 것도 좋습니다.

    관련 문제