2017-09-12 3 views
0

저는 트리 구조의 일종을 구현하는 C++의 인터페이스 (추상 클래스)를 설계하고 있습니다. 각 인스턴스에는 0 개, 1 개 이상의 자식이 있습니다. 아이는 인터페이스의 인스턴스이기도합니다.추상 클래스 컬렉션에 대한 액세스 제공

저는 일반적으로 특정 구현을 제외하지 않기 위해 인터페이스에 꽤 많은 생각을했습니다. 예를 들어, 메소드는 값을 어딘가에 저장하도록 구현 된 것처럼 참조를 리턴해서는 안됩니다. 이는 각 호출에서 값을 다시 계산하는 구현을 제외합니다. 또는 어떤 식 으로든 반환 된 값을 변환하는 래퍼.

그러나이 인터페이스를 사용하여 인스턴스의 하위 항목에 액세스하는 가장 좋은 방법은 확실하지 않습니다. 지금까지, 나는 두 가지 옵션을 마련했습니다

class Interface 
{ 
public: 

    virtual ~Interface() = default; 

    // IDEA 1: return a collection of references. 
    virtual auto getChildren() const -> std::vector<std::reference_wrapper<Interface>> = 0; 

    // IDEA 2: accept a visitor. 
    virtual void visitChildren(const std::function<void(Interface&)> &visitor) const = 0; 

}; 

내 질문 : 추상 클래스의 컬렉션에 대한 액세스를 제공하는 가장 좋은 * 방법은 무엇인지. 다른 아이디어와 접근 방식을 매우 높이 평가합니다 (예 : 가능한 경우 반복기 기반 접근 방식).

* 다음과 같은 속성의 일부 또는 모든 : ... 당신의 디자인은 옆으로 너무 자바와 같은 존재의 논의를 배치

+3

은 당신이 반복자 들어 본 적이 :

class Interface { class iterator_impl { virtual ~iterator_impl() = default; // Fill the rest }; public: class iterator { std::unique_ptr<iterator_impl> _impl; iterator(std::unique_ptr<iterator_impl> impl) : _impl(std::move(impl)) {} public: Iterface& operator*() { //forward to _impl } }; virtual iterator begin() = 0; virtual iterator end() = 0; }; 

전체 반복자 프로토콜을 공급 후, Interface&는 관용적 C++ 코드에서 사용할 수 있습니까? 그것은 C++의 지배적 인 관용구입니다. 표준 라이브러리를 살펴보십시오. – StoryTeller

+0

@StoryTeller 여기에서 반복기를 어떻게 사용하는지 예제를 제공해 주실 수 있습니까? ('begin'과'end' 함수도 순수 가상이어야합니다)? 아니면 반복자 접근 방식을 잘못 생각하고 있습니까? –

+0

공동 변형 리 턴 유형을 생각하십시오 (다소). 추상 반복자에 대한 핸들을 반환합니다. 'begin'과'end'는 물론 가상 일 것입니다. – StoryTeller

답변

1

강한 의미, 가장 직관적 인, 가장 관용적 가장 유연하고 확장 성이 가장 뛰어난, 대부분의 유지 보수 . 당신은 관용적 C++에 근접 할 경우, 반복자에 갈 :

void foo(Interface& interface) { 
    for(auto& i : interface) { 
    //Do stuff 
    } 
}