클래스에서 생성자를 비공개로 만들어야하는 이유는 무엇입니까? 우리는 항상 생성자가 공개되어야합니다.
답변
개인 생성자가 필요한 몇 가지 이유는 다음과 같습니다.
- 생성자는 클래스 자체의 정적 팩토리 메소드 에서만 액세스 할 수 있습니다 . 싱글 톤도이 카테고리에 속할 수 있습니다.
- 정적 메소드 만 포함 하는 유틸리티 클래스
답변
개인 생성자를 제공하면이 클래스 이외의 다른 위치에서 클래스 인스턴스가 작성되지 않습니다. 이러한 생성자를 제공하기위한 몇 가지 사용 사례가 있습니다.
A. 클래스 인스턴스는 static
메소드 에서 작성됩니다 . static
그런 다음 이 메소드는로 선언됩니다 public
.
class MyClass()
{
private:
MyClass() { }
public:
static MyClass * CreateInstance() { return new MyClass(); }
};
B. 수업은 싱글 톤 입니다. 이것은 프로그램에 클래스의 인스턴스가 두 개 이상 존재하지 않음을 의미합니다.
class MyClass()
{
private:
MyClass() { }
public:
MyClass & Instance()
{
static MyClass * aGlobalInst = new MyClass();
return *aGlobalInst;
}
};
C. (다가오는 C ++ 0x 표준에만 적용됨) 여러 생성자가 있습니다. 그들 중 일부는 선언 public
되고 다른 것들은 선언 됩니다 private
. 코드 크기를 줄이기 위해 공개 생성자는 모든 작업을 수행하는 개인 생성자를 ‘호출’합니다. 귀하의 public
생성자 따라서이라고 위임 생성자를 :
class MyClass
{
public:
MyClass() : MyClass(2010, 1, 1) { }
private:
MyClass(int theYear, int theMonth, int theDay) { /* do real work */ }
};
D. 개체 복사를 제한하려고합니다 (예 : 공유 리소스 사용으로 인해).
class MyClass
{
SharedResource * myResource;
private:
MyClass(const MyClass & theOriginal) { }
};
E. 수업은 유틸리티 수업 입니다. 즉, static
회원 만 포함한다는 의미 입니다. 이 경우 프로그램에서 개체 인스턴스를 만들면 안됩니다.
답변
다른 친구 클래스 / 함수가 사용자에게 금지 된 방식으로 객체를 구성 할 수있게하는 “후문”을 떠나는 것. 염두에 두는 예는 반복자를 구성하는 컨테이너 (C ++)입니다.
Iterator Container::begin() { return Iterator(this->beginPtr_); }
// Iterator(pointer_type p) constructor is private,
// and Container is a friend of Iterator.
답변
모두 싱글 톤에 갇혀있어
다른 것들:
- 사람들이 스택에서 수업을 만들지 못하게합니다. 전용 생성자를 만들고 팩토리 메소드를 통해 포인터를 넘겨줍니다.
- 클래스 사본 작성 금지 (개인 사본 생성자)
답변
이것은 공통 코드를 포함하는 생성자에게 매우 유용 할 수 있습니다. 개인 생성자는 ‘this (…);’를 사용하여 다른 생성자가 호출 할 수 있습니다. 표기법. 개인 (또는 보호 된) 생성자에서 공통 초기화 코드를 만들면 코드가 생성 중에 만 호출된다는 것을 분명히 알 수 있습니다.
public class Point {
public Point() {
this(0,0); // call common constructor
}
private Point(int x,int y) {
m_x = x; m_y = y;
}
};
답변
공개 생성자를 사용하고 싶지 않은 경우가 있습니다. 예를 들어 싱글 톤 클래스를 원한다면
타사에서 사용하는 어셈블리를 작성하는 경우 어셈블리에 의해서만 생성되고 어셈블리 사용자가 인스턴스화하지 않는 많은 내부 클래스가있을 수 있습니다.
답변
이를 통해 사용자 (개인 생성자가있는 클래스)가 생성자 호출 방식을 제어 할 수 있습니다.
예제 : 팩토리 메소드가 객체를 할당하기로 선택한 경우 (예 : 싱글 톤 팩토리와 같이) 클래스의 정적 팩토리 메소드가 객체를 반환 할 수 있습니다.