Device 클래스가 있다고 가정 해 보겠습니다. 필자는 프로그래머가 자신의 Device 객체를 인스턴스화하여 DeviceManager 클래스를 만들지 못하게하려고합니다. DeviceManager는 인스턴스화 될 유일한 엔티티이며, 프로그래머가 일종의 ID를 지정하게함으로써 프로그래머가 Device 객체에 액세스 할 수있게합니다. 이렇게하면 DeviceManager 클래스 만 프로그래머가 정리할 수 있으며 이탈 한 Device 객체는 남겨 두지 않습니다. 나의 주요 관심사는 가비지 수집에 관심이있는 객체에 대한 액세스를 제어하는 방법입니다. C++에서 좋은 아이디어를 묘사 한 것처럼 "관리자"패턴입니까? 감사!C++에서 개체에 대한 액세스를 어떻게 제어 할 수 있습니까?
0
A
답변
2
정말로 필요한 경우 예.
는Device
클래스에서 보호 당신이
DeviceManager
을
Device
private
의 생성자를 확인하고 선언 할 수 있습니다,이 컨트롤을 달성하기 위해.
class Device
{
private: //not necessary, private by default
Device();
friend class DeviceManager;
};
class DeviceManager
{
public:
Device* getDevice();
};
당신은 또한 (권장) Device
에 스마트 포인터를 반환 할 수 있고 당신이 필요에 따라 DeviceManager
내부에서 생성 장치를 유지한다.
이것을 인스턴스 매니저 패턴이라고합니다. DeviceManager
은 또한 장치 공장입니다.
또한 C++에는 가비지 수집이 없지만 스마트 포인터를 사용하면 메모리 관리에 대해 걱정할 필요가 없습니다.
0
우리는 Private Constructor를 사용하여이를 수행 할 수 있습니다. 전용 생성자는 특별한 종류의 생성자입니다. 정적 멤버 만 포함하는 클래스에서 일반적으로 사용됩니다. 클래스에 하나 이상의 개인 생성자 및 공용 생성자가 없으면 다른 클래스에서이 클래스의 인스턴스를 만들 수 없습니다. 는 예컨대 들어
class abc
{
private abc()
{}
}
빈 생성자의 선언은 기본 생성자의 자동 생성을 방지 할 수 있습니다. 생성자에 액세스 한정자를 사용하지 않으면 기본적으로 여전히 private이됩니다. 그러나 private 수정자는 일반적으로 클래스를 인스턴스화 할 수 없다는 것을 명확히하기 위해 명시 적으로 사용됩니다.
전용 생성자는 Math 클래스와 같은 인스턴스 필드 나 메서드가 없을 때 또는 클래스 인스턴스를 얻기 위해 메서드가 호출 될 때 클래스의 인스턴스 생성을 방지하는 데 사용됩니다. 클래스의 모든 메소드가 정적 인 경우 전체 클래스를 정적으로 만드는 것을 고려하십시오.
관련 문제
- 1. 개체에 대한 액세스 제어
- 2. 액티브 레코드 개체에 대한 액세스를 어떻게 인증해야합니까?
- 3. 저장된 데이터에 대한 액세스를 어떻게 동기화 할 수 있습니까?
- 4. mod_wsgi를 사용할 때 공유 리소스에 대한 액세스를 어떻게 제어 할 수 있습니까?
- 5. htpasswd 액세스를 어떻게 디버깅 할 수 있습니까?
- 6. 테이블의 특정 열에 대한 액세스를 제어 하시겠습니까?
- 7. Crystal Reports를 URL 액세스를 통해 제어 할 수 있습니까?
- 8. 개체에 대한 액세스를 제한하는 방법은 무엇입니까?
- 9. 어떻게 자동으로 터미널을 제어 할 수 있습니까?
- 10. C에서 개체에 대한 포인터에 대한 메서드 사용
- 11. const 개체에 대한 읽기 전용 액세스를 위해 const_cast를 사용하고 있습니까? C에서
- 12. 어떻게 전화를 제어 할 수 있습니까?
- 13. UIImageView 애니메이션을 어떻게 제어 할 수 있습니까?
- 14. 카산드라 복제를 어떻게 제어 할 수 있습니까?
- 15. 어떻게 다른 프로그램을 제어 할 수 있습니까?
- 16. 어떻게 C에서 오디오를 녹음 할 수 있습니까?
- 17. C에서 함수 매개 변수의 정렬을 제어 할 수 있습니까?
- 18. 어떻게 데이터베이스 액세스를 측정하고 최적화 할 수 있습니까?
- 19. myapp.herokuapp.com에 대한 액세스를 허용하지 않을 수 있습니까?
- 20. 로컬 범위에 대한 __dict__ 개체에 액세스 할 수 있습니까?
- 21. 비즈니스 논리별로 자산에 대한 액세스를 제한 할 수 있습니까?
- 22. 특정 웹 사이트에 대한 액세스를 제한 할 수 있습니까?
- 23. 모든 파일에 대한 ASP.NET 익명 액세스를 거부 할 수 있습니까?
- 24. 외부 리소스에 대한 액세스를 직렬화 할 수 있습니까?
- 25. 사용자 정의 필드 유형에 대한 액세스를 제한 할 수 있습니까?
- 26. 암호로 Cruisecontrol.net에서 certaion 프로젝트에 대한 액세스를 제한 할 수 있습니까?
- 27. 프로그래밍 방식으로 웹 서비스에 대한 액세스를 제한 할 수 있습니까?
- 28. URL을 통해 PartialViewResult 액션에 대한 액세스를 거부 할 수 있습니까?
- 29. 레일즈에서 특정 IP에 의한 액세스를 어떻게 막을 수 있습니까?
제외하고 ** 나는 장치에 대한 포인터를 반환하지 않습니다. DeviceManager가 수명을 관리하거나 스마트 포인터를 반환하여 호출자와 소유권 공유 의미를 나타내면 호출자가 반환 된 장치의 소유권을 가져 오거나 공유하는지 여부를 나타냅니다. –