문제

컨테이너 클래스 또는 수업 내부의 다른 클래스를 개인 또는 공개 회원으로 배치하는 가장 좋은 방법은 무엇입니까?

요구 사항 :

1. Vector <SomeClass> 내 수업 내부

2. 벡터의 add와 count가 필요합니다

도움이 되었습니까?

해결책

컨테이너의 상태가 클래스의 불변의 일부라면 가능하면 개인이어야합니다.

예를 들어, 컨테이너가 3 차원 벡터를 나타내는 경우 불변의 일부는 항상 정확히 3 개의 숫자를 포함한다는 것일 수 있습니다. 공개 회원으로 노출하면 클래스 외부의 코드가 컨테이너 크기를 변경할 수있게되므로 컨테이너 크기가 일정 해야하는 모든 루틴에 문제가 발생할 수 있습니다. 컨테이너를 개인을 유지하면 컨테이너 크기를 클래스 멤버 기능으로 수정할 수있는 소프트웨어의 장소를 제한합니다.

다른 팁

회원이 개인 또는 공개 선언되는지 여부는 전적으로 귀하의 신청에 따라 다릅니다. 더 자세한 내용을 줄 수 있습니까?

회원을 선언 할 때 기억해야 할 중요한 점 중 하나는 회수를 검색하기 위해 "getter"를 제공하는 경우 더 이상 해당 객체를 캡슐화하지 않는다는 것입니다. 대신, 노출하려는 기능 만 노출하는 래퍼 메소드를 작성하는 것이 좋습니다.

예를 들어, 벡터 멤버를 사용하면 첨가 및 명확한 메소드를 작성할 수 있습니다. 이것이 모든 기능을 노출하려는 기능인 경우.

당신은 수업에 대해 이야기하고 있기 때문에 비공개 여야한다고 생각합니다. 당신이 공개되기를 원한다면 오히려 구조물을 만드십시오. 회원 사용할 변수.

노출을위한 실행 가능한 대안 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 구현을 사용하지 않을 수 있으므로 이러한 멤버 변수의 레이아웃이 다를 수 있습니다!

모든 회원을 비공개로 만들고 액세서 방법을 사용하면 나중에 구현을 변경할 수 있습니다. 매우 특이한 상황에서만 데이터 멤버를 공개 할 것입니다.

컨테이너의 유형을 변경하는 경우가 아니라 메커니즘을 바꾸고 싶을 수도 있습니다. 목록에 이름을 저장하고 있다고 가정 해 봅시다. 잠시 후 해시 로이 목록을 색인으로 선택할 수 있으며 새 이름을 추가 할 때마다 해시를 업데이트하고 싶습니다. 구현이 적절하게 캡슐화되면이 작업을 수행하는 것이 쉽습니다. 벡터를 방금 노출시킨 경우 인터페이스를 조정하는 변경 사항을 변경해야합니다 (따라서 변경 사항이 파열됩니다).

이것이 새로 새로운 경우 : 당신은 다음을 읽습니다. http://en.wikipedia.org/wiki/encapsulation_(classes_-_computers)

세 번째 방법이 있습니다. 때로는 컨테이너에서 상속하고 목표를 달성하는 방법 (예 : 스레드 안전)을 무시하는 것이 더 좋습니다. 어쨌든, 그것을 거의 항상 공개하는 것은 좋은 생각이 아닙니다.

다른 클래스 내에서 컨테이너를 캡슐화하려는 것을 고려하면 공개 할 수 없으며, 또한 클래스의 공개 방법이 컨테이너에 대한 구현에 따른 것을 드러내지 않아야합니다. 이렇게하면 클래스 구현 (예 : 컨테이너)을 인터페이스를 변경하지 않고 변경할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top