2008-10-13 2 views
2

컨테이너 클래스 또는 다른 클래스를 개인 또는 공용 멤버로 클래스에 넣는 가장 좋은 방법은 무엇입니까?개인/공공 회원으로 벡터를 사용하는 클래스 디자인?

요구 사항 :

1.Vector < someclass> 내 수업

2.Add 및 벡터의 수를 내부 구성원 개인 선언 또는 공용 응용 프로그램에 전적으로 달려있다 인터페이스

+0

숙제 같은 냄새 ... – JohnMcG

답변

1

컨테이너의 상태가 클래스의 invariant의 일부인 경우 가능한 경우 비공개가되어야합니다.

예를 들어 컨테이너가 3 차원 벡터를 나타내는 경우 불변량의 일부는 항상 정확히 3 개의 숫자를 포함 할 수 있습니다. 공개 멤버로 공개하면 클래스 외부의 코드가 컨테이너 크기를 변경할 수 있으므로 컨테이너 크기가 일정해야하는 루틴에 문제가 발생할 수 있습니다. 컨테이너를 비공개로 유지하면 소프트웨어의 컨테이너 크기를 클래스의 멤버 함수로 수정할 수있는 위치가 제한됩니다.

1

에게 필요 . 좀 더 자세히 설명해 주시겠습니까?

멤버를 선언 할 때 기억해야 할 점 중 하나는 "getter"를 검색하여 검색하면 더 이상 해당 객체를 캡슐화하지 않는다는 것입니다. 대신, 노출하고자하는 기능 만 노출하는 래퍼 메소드를 작성하는 것이 좋습니다.

예를 들어 Vector 멤버를 사용하면 추가 할 기능이 모두있는 경우 AddItem 및 Clear 메서드를 작성할 수 있습니다.

0

모든 구성원을 비공개로 설정하고 접근 자 방법을 사용하면 나중에 구현을 변경할 수 있습니다. 매우 특별한 경우에만 모든 데이터 회원을 공개 할 수 있습니다.

구현을 변경하면 컨테이너 유형을 변경하는 것만이 아니라 메커니즘을 변경하려는 생각보다 더 자주 발생한다는 것을 기억하십시오. 이름을 목록에 저장했다가 잠시 후에 해시로이 목록의 색인을 생성하도록 선택할 수 있으며 새 이름을 추가 할 때마다 해시를 업데이트하려고합니다. 구현을 적절하게 캡슐화했다면 이렇게하는 것이 쉽습니다. 벡터를 방금 노출 한 경우 인터페이스를 조정할 변경 사항을 적용해야합니다 (변경 사항이 파문이 될 것입니다).

이 새에 당신의 읽기가 새로운 경우 : http://en.wikipedia.org/wiki/Encapsulation_(classes_-_computers)

0

세 번째 방법이 있습니다 - 때로는 용기에서 상속하고 (예를 들어, 스레드 안전을 위해) 당신의 목표를 달성하기 위해 방법을 오버라이드 (Override)하는 것이 좋습니다 . 어쨌든, 대중에게 거의 항상 좋은 생각이 아닙니다.

+0

STL 용기에는 가상 소멸자 또는 가상 방법이 없으므로 위험 할 수 있습니다. – bk1e

0

다른 클래스 내부의 컨테이너를 캡슐화하려는 것은 public 일 수 없다는 것을 의미하며 클래스의 public 메소드는 컨테이너에 대한 구현 관련 사항을 모두 나타내지 않아야합니다. 이렇게하면 인터페이스 (인터페이스)를 변경하지 않고도 클래스 (즉 컨테이너)의 구현을 변경할 수 있습니다.

1

클래스에 대해 이야기하고 있으므로 개인적이어야한다고 생각합니다. 공개 되길 원한다면 구조체를 만드십시오. 구성원 변수를 사용하기를 원할 것입니다.

vector 회원을 노출시키는 실용적인 대안은 방문자 함수 (또는 내부 반복자)를 만드는 것입니다. 이렇게하면 Demeter의 법칙을 잘 준수하게됩니다.

class ContWrapper { 
    std::vector<int> _ints; 
public: 
    class Action { 
    public: 
     virtual void accept(int i) = 0; 
    }; 
    void each_int(Action& a); 
}; 

또한 내보낼 때 매우주의해야합니다. 라이브러리의 std::vector<T>도 마찬가지입니다. 클라이언트 코드는 이전과 같은 STL 구현을 사용하지 않을 수 있으므로 이러한 멤버 변수의 레이아웃이 다를 수 있습니다.