2008-11-12 2 views
3

클래스에 대한 인터페이스 래퍼를 만들고 있습니다. 클래스 내의 멤버는 참조입니다 (큰 구조체를 복사하지 않기 위해). 개인 생성자를 만드는 경우 컴파일러를 달래기 위해 해당 참조를 초기화하는 가장 좋은 방법은 무엇입니까?private 생성자의 참조 멤버로 클래스를 초기화하는 방법은 무엇입니까?

struct InterfaceWrapper { 
    InterfaceWrapper(SomeHugeStructure& src):m_internal(src){}; 
    int someElement(void) const { return m_internal.someElement; }; 
private: 
    InterfaceWrapper(){} // initialize m_internal 
    SomeHugeStructure& m_internal; 
}; 

답변

4

다른 사람들이 언급 한 것처럼 다른 사람들이 기본 생성자를 호출하지 못하게하려는 경우에는 본문을 제공하지 않으려 고하고 다른 생성자가 있고 컴파일러에서 ' 그것을 당신을 위해 생성하지 마십시오.

클래스의 친구들에게 액세스를 제한하는 것이 목적이라면 포인터 (선호하는 스마트 포인터) 멤버를 사용하고 NULL로 설정하는 것이 가장 좋습니다.

-이 구조체가 아닌 클래스를 만든 이유

또한, 잘 모르겠어요. 일반적으로 구조체를 만드는 것은 데이터 멤버를 C와 유사하게 공개 할 때 의미가 있습니다.이 경우에는 기존 클래스가있는 것처럼 보입니다.이 경우 C++ 규칙은 클래스로 만드는 것입니다.

4

요소가없는 클래스를 실제로 만들어야하는 경우 참조가 이동하는 방법이 아닙니다.

참조를 사용해야하는 유일한 이유는 복사를 피하는 것이기 때문에 포인터를 사용하는 것이 좋습니다. 일반 생성자에서 전달 된 참조의 주소를 가져 와서 개인 생성자에서 NULL로 초기화 할 수 있습니다. 개체의 수명이 끝나면 포인터는 매달린 포인터가되지만 참조는 마찬가지입니다 ...

또는 public 생성자에 스마트 포인터를 사용하고 멤버로 스마트 포인터를 사용하도록합니다. 일생을 걱정했다.

물론 클래스의 나머지 코드에서 포인터가 NULL 일 수 있습니다. (하지만 당신은 회원이 참관의 기준이 될 수 있으므로 실제로 문제가되지 않습니다.)

1

개인 ctor의 요점은 무엇입니까? m_internal이 유효한 객체를 참조하지 않으면 어떻게 유용 할 수 있습니까?

또한 m_internal->는 컴파일되지 않습니다. 그것은 포인터 구문이며 ref는 아닙니다. 당신이 그것을 사용하는 사람을 방지하기 위해 기본의 ctor의 개인을하는 경우

2

후 바로 몸을 떠나 :

private: 
    InterfaceWrapper(); 
    SomeHugeStructure& m_internal; 
컴파일러는 다른 곳에서 정의 생각하며, 링커가 있다고 생각하지 않습니다

누군가가 그것을 사용하려고 시도하지 않는 한.

+0

다른 생성자를 정의하면 컴파일러에서 자동으로 기본 생성자를 생성하지 않습니다. 따라서이 경우 코드에서 안전하게 제거 할 수 있습니다. –

관련 문제