2015-02-04 1 views
0

회사 필기 시험에서이 질문에 직면했습니다. 수업은 다음과 같이 진행됩니다.클라이언트가 목록 개체를 수정하지 못하도록하는 방법

class DB 
{ 
ABC *list; 
public: 
ABC *getlist(); 
ABC *addlast(); 
ABC *remove(x); 
ABC *freelist(); 
..... 
} 

이제 클라이언트가 직접 목록을 수정할 수있는 모든 인스턴스를 찾습니다. 따라서 클라이언트는 getlist로 포인터를 가져 와서 재생하거나 ABC 클래스 API를 사용하여 더 많이 수정할 수 있습니다.

  1. 클라이언트가이를 수정하지 못하게하는 방법. 클라이언트가이를 수행 할 수없는 클래스 아키텍처가 만들어 질 수 있습니다.
+0

반환 된 포인터를 수정하지 못하게하려면 const_iterator를 사용하십시오. – MNS

답변

1

악마의 세부 사항 : DB API의 어떤 측면을 유지해야하는지.

class DB 
{ 
    ABC list; // I'd store by value unless there's a reason not to 
    public: 
    ABC getlist() const;   // only get a copy 
    const ABC& getlistref() const; // another option... 
    void addlast(x); 
    void remove(x); 
    void freelist(); 
..... 
}; 

다른 옵션은 list 사용하여 반복자 (즉 beginend 기능) 노출, 또는를 제공하는 것을 포함 ... 여전히 의사 코드 스타일을 사용하여 -

가장 간단한 방법은 제대로 list을 캡슐화하는 것입니다 visit(VisitorFunctor&)은 클라이언트 코드가 목록의 모든 요소에 대해 무언가를 수행하도록하는 기능입니다.

관련 문제