2012-03-15 2 views
0

Device 클래스가 있다고 가정 해 보겠습니다. 필자는 프로그래머가 자신의 Device 객체를 인스턴스화하여 DeviceManager 클래스를 만들지 못하게하려고합니다. DeviceManager는 인스턴스화 될 유일한 엔티티이며, 프로그래머가 일종의 ID를 지정하게함으로써 프로그래머가 Device 객체에 액세스 할 수있게합니다. 이렇게하면 DeviceManager 클래스 만 프로그래머가 정리할 수 있으며 이탈 한 Device 객체는 남겨 두지 않습니다. 나의 주요 관심사는 가비지 수집에 관심이있는 객체에 대한 액세스를 제어하는 ​​방법입니다. C++에서 좋은 아이디어를 묘사 한 것처럼 "관리자"패턴입니까? 감사!C++에서 개체에 대한 액세스를 어떻게 제어 할 수 있습니까?

답변

2

정말로 필요한 경우 예.

Device 클래스에서 보호 당신이 DeviceManagerDevice private의 생성자를 확인하고 선언 할 수 있습니다,이 컨트롤을 달성하기 위해.

class Device 
{ 
private: //not necessary, private by default 
    Device(); 

friend class DeviceManager; 
}; 

class DeviceManager 
{ 
public: 
    Device* getDevice(); 
}; 

당신은 또한 (권장) Device에 스마트 포인터를 반환 할 수 있고 당신이 필요에 따라 DeviceManager 내부에서 생성 장치를 유지한다.

이것을 인스턴스 매니저 패턴이라고합니다. DeviceManager은 또한 장치 공장입니다.

또한 C++에는 가비지 수집이 없지만 스마트 포인터를 사용하면 메모리 관리에 대해 걱정할 필요가 없습니다.

+0

제외하고 ** 나는 장치에 대한 포인터를 반환하지 않습니다. DeviceManager가 수명을 관리하거나 스마트 포인터를 반환하여 호출자와 소유권 공유 의미를 나타내면 호출자가 반환 된 장치의 소유권을 가져 오거나 공유하는지 여부를 나타냅니다. –

0

우리는 Private Constructor를 사용하여이를 수행 할 수 있습니다. 전용 생성자는 특별한 종류의 생성자입니다. 정적 멤버 만 포함하는 클래스에서 일반적으로 사용됩니다. 클래스에 하나 이상의 개인 생성자 및 공용 생성자가 없으면 다른 클래스에서이 클래스의 인스턴스를 만들 수 없습니다. 는 예컨대 들어

class abc 
{ 
private abc() 
{} 

} 

빈 생성자의 선언은 기본 생성자의 자동 생성을 방지 할 수 있습니다. 생성자에 액세스 한정자를 사용하지 않으면 기본적으로 여전히 private이됩니다. 그러나 private 수정자는 일반적으로 클래스를 인스턴스화 할 수 없다는 것을 명확히하기 위해 명시 적으로 사용됩니다.

전용 생성자는 Math 클래스와 같은 인스턴스 필드 나 메서드가 없을 때 또는 클래스 인스턴스를 얻기 위해 메서드가 호출 될 때 클래스의 인스턴스 생성을 방지하는 데 사용됩니다. 클래스의 모든 메소드가 정적 인 경우 전체 클래스를 정적으로 만드는 것을 고려하십시오.

관련 문제