2009-06-29 3 views

답변

73

클래스가 추상 클래스 인 경우 보호 된 생성자는 정확히 맞습니다. 이 상황에서는 객체가 클래스에서 인스턴스화되는 것을 원하지 않지만이를 상속하기 위해서만 객체를 사용합니다.

특정 구성 매개 변수 집합을 파생 클래스로 제한해야하는 경우와 같은 다른 사용 사례가 있습니다.

+7

+1하지만 반드시 추상적 인 클래스 일 필요는 없습니다. 그것은 종종 그렇습니다. – ralphtheninja

+4

기본 클래스를 정의하기 위해 함수를 순수 가상으로 선언하는 것으로 충분하지 않습니까? 또는 위는 순수 가상 기능이없는 경우입니다. 그런 추상 클래스의 파생 클래스에 대한 생성 이벤트는 무엇입니까? –

+0

@Henk Holterman C++ 표준의 10.4 절, "추상 클래스"를 참조하십시오. –

11

하나 개 사용하는 생성자를 사용하여 보호 된 생성자에만 유도 부재는 클래스 (파생 인스턴스)의 인스턴스를 생성 할 수 있다는 것을 의미 공장 패턴

6

수 있었다. 닭고기와 달걀이 조금 들리지만, 클래스 팩토리를 구현할 때 때로는 유용합니다.

+3

기술적으로 이것은 모든 요소가 보호되는 경우에만 적용됩니다. – MSalters

+1

친구 클래스는 보호 된 생성자 (파생 클래스가 아님)를 호출 할 수도 있습니다. –

+0

...protected 생성자를 호출하는 friend 클래스의 사용은 상수 (생성자에 의해 설정 됨)이지만 public이되어야하지만 다른 공개 액세스로 설정되지 않는 멤버가있는 객체의 경우에 해당합니다. 객체는 다른 곳에서 생성되지 않으므로 데이터는 다른 어느 곳에서도 수정되지 않습니다. – osirisgothra

3

인스턴스 작성자가 직접 액세스 할 수없는 생성자를 서브 클래스에서 사용하게하십시오.

3

당신은 예를 들어,을 만들 수있는 클래스를 제한하는 데 사용할 수 있습니다 : 당신이 레벨 알고 항상 있도록

class Level 
{ 
private: 

Level(); 
¨Level(); 

friend class LevelManager; 
}; 

의 인스턴스를 만들 수있는 유일한 클래스의 LevelManager 클래스입니다 인스턴스가 LevelManager에 만들어집니다.

+0

사실, 이는 개인 생성자이며 보호되지 않습니다. – David

+0

아하하니, 잘못 읽었습니다. 내 게시물을 삭제해야합니까? –

7

비공개 생성자는 생성자가 단독으로 보증 할 수없는 생성 요구 사항이있는 경우에 유용합니다. 예를 들어 초기화 메소드를 생성자 바로 다음에 호출해야하거나 객체가 일부 컨테이너/관리자 객체에 등록해야하는 경우 생성자 외부에서 초기화 메소드를 수행해야합니다. 생성자에 대한 액세스를 제한하고 팩토리 메서드 만 제공하면 사용자가받는 모든 인스턴스가 해당 보장을 모두 충족하는지 확인할 수 있습니다. 이것은 또한 싱글 톤을 구현하는 데 자주 사용되며, 이는 클래스가 만드는 또 다른 보장입니다 (단일 인스턴스 만있을 것임).

생성자를 private가 아닌 protected로 만드는 이유는 private가 아닌 다른 메서드 나 필드를 protected로 만드는 경우와 동일하므로 자식에서 상속 할 수 있습니다. 아마도 파생 클래스의 인스턴스에 대한 참조를 반환하는 기본 클래스에 public이 아닌 가상 팩토리 메서드가 필요합니다. 파생 클래스는 분명히 부모 생성자에 대한 액세스를 원하지만 여전히 팩토리 외부에 생성하고 싶지는 않습니다.

2

부작용이있는 공장 방법의 경우.

class mine { 

    private: 
    mine() {}; 

    protected: 
    mine(int id) : m_id(id) {}; 

    int m_id; 
    static int m_count; 

    public: 
    static mine* CreateOneOfMe() { 
     return mine(m_count++); 
    } 

    int GetId() { return m_id; } 

}; 

이렇게하면 클래스의 인스턴스가 만들어지고 각각 고유 한 증분 정수 ID가 보장됩니다. 사용하려는 생성자가 기본값이 아닌 경우 기본값을 숨겨야합니다.

5

보호 된 생성자를 사용하여 메소드가 순수 가상이 아닌 클래스를 효과적으로 추상화 할 수 있습니다.

친구 클래스가 여전히 재정의하지 않고도 사용할 수 있기 때문에 C++에서 상당히 추상적이지는 않지만, 다음은 이것을 선언해야합니다.

관련 문제