2011-04-01 2 views
3

개체 소유자 배가 변경되는지 여부에 관계없이 메서드의 서명을 코딩하는 방법이 있습니까? 포인터를 가져 오거나 반환하는 Getter() 및 Setter()에서 개체 소유권이 변경되는지 여부는 알 수 없습니다.메서드에서 개체 소유권 명명 규칙

그래서
// Uses pConfiguration or creates its own copy - the ownership is un-touched 
void ContainerClass:SetConfiguration(const Configuration* pConfiguration) {} 
// Takes the ownership of pConfiguration (and deletes it in the destructor) 
void ContainerClass:PutConfiguration(Configuration* pConfiguration) {} 
// Returns a 'reference' and keeps the ownership (you must not delete it) 
const Configuration* ContainerClass::GetConfiguration() {} 
// Returns a _new_ object and transfers the ownership to you 
Configuration* ContainerClass::TakeConfiguration() {} 

는 (설정) 대 (넣어)와()를 코딩하는 방법을 가지고 대) (취득한다, 또는 당신은 (을 const 유형을 사용 :에 대한

여러분의 생각은 대 비 const) - 또는 컨텍스트에서 알 수 있습니까?

최고 감사합니다,

CHARLY는

+0

스마트 포인터를 확인 했습니까? 이러한 유형의 문제를 피할 수 있습니다. – Naveen

+0

흠 ... 삭제 문제를 해결하지만 ... 여전히 개체 소유권에 대해서는 아무 말도하지 않습니다.나는 내 모든 문제를 해결한다면 그것에 대해 생각해야만한다. – Charly

답변

5

인터페이스에서 소유권이 변경되지 않았 음을 식별하는 가장 좋은 방법은 포인터를 사용하지 않는 것입니다. 포인터에 대한 참조 선호 :

// Does not take ownership 
void ContainerClass::SetConfiguration(const Configuration& config) {} 

// Does not release ownership 
const Configuration& ContainerClass::getConfiguration() const {} 

실제로 메모리 소유권을 이전해야하는 경우 이름별로 문서화하는 것이 좋습니다. 당신이 정말로 서명에 그것을 명시 적으로 만들 수있는 갈망을 느끼는 경우, std::auto_ptr 좋은짜리를 사용

void ContainerClass::SetConfiguration(std::auto_ptr<Configuration> cfg); 
std::auto_ptr<Configuration> ContainerClass::CopyConfiguration() const; 

std::auto_ptr 실제로 전송 소유권을 의미 복사 이상한 속성이 있습니다.

2
  1. 이 기능은 종종 예를 itemAt 항상 takeAtaddXXX 요구 소유권 방법과 재생 Qt는에서
  2. (당신은 doxygen이를 사용할 수있는) 좋은 문서 및 의견 쓰기 문서에 반영된 소유권을 양도합니다. 따라서 get()/take()set()/put()을 사용할 수 있습니다. 어쨌든, 좋은 문서는 항상 도움이된다. 심지어 함수 이름조차도 설명된다.
+0

좋은 문서는 아무 것도 논할 것이 없다. 그러나 서명에 명명 규칙을 사용하면이 정보를 코드에 포함시킬 수 있으며 다른 헤더에는 포함하지 않을 것입니다. – Charly

+0

* Qt *와 * 좋은 문서 *를 같은 문장에서 말할 수는 없습니다. Qt의 문서는 거의 부족하고 함수 서명에 관한 (문서화 된) 규칙도 없습니다. [QBoxLayout :: addWidget] (http://doc.qt.io/qt-5/qboxlayout.html#addWidget)이 인수의 소유권을 이전합니까? 맞춰봐. 설명서를 읽으십시오. 소스 코드를 읽으십시오. 어떤 시점에서 당신은 * "wtf!"*를 범해라. 좋은 문서의 예로 Qt를 사용하지 마십시오. 문서에서 소스 코드를 읽게되면 뭔가 잘못되어 있습니다. – IInspectable

0

대부분의 경우 포인터를 사용하면 을 시작하는 "소유권"이 없으므로 변경 사항이 없습니다. 그러나 디자인이 핵심입니다. 클래스의 역할은 객체와의 관계를 분명히해야합니다. . 소유권이나 그 이상의 수준. 그리고 관계가 차례로 개체와 함께 수행 할 작업을 결정합니다.

예외적 인 소유권이있는 경우 std::auto_ptr 은 전송 표현의 표준 방법입니다. 그것은 절대 전송, 비록; 매개 변수의 유형이 std::auto_ptr 인 경우 호출자 은 해당 함수를 호출 한 후에도 객체에 액세스 할 수 없습니다. ( 은 스레드 스레딩에서이 점이 매우 유용하다는 것을 알았습니다. 특정 스레드가 언제든지 객체를 소유 할 수 있도록 을 찾았습니다. 다른 스레드가 액세스 할 수 없다는 것을 std::auto_ptr은 이라고 표현합니다. 명확하고 효과적으로.