문제

C ++에서 인수 사용을 표현하는 일반적인 방법이 있습니까? 나는 내 수업의 소비자들에게 그들이 통과 한 주장이 수업에서 어떻게 사용될 것인지 암시 적으로 말하고 싶습니다.

예 :

  1. 나는 당신의 주장을 소유하고 있습니다 (정리 할 것입니다)
  2. 나는 평생 동안 당신의 주장에 대한 언급을 할 것입니다 (그래서 내가 살아있는 동안 당신은 그것을 삭제해서는 안됩니다)
  3. 나는 건설 중에 만 당신의 주장을 사용할 것이며 참조를 보유하지 않을 것입니다.

메소드 선언을 사용하여 이러한 것들을 표현하는 일반적인 방법이 있습니까? 첫 번째 경우 std :: auto_ptr가 의미가 있다고 생각합니다. 두 번째 경우에 나는 보통 스택에서 값을 전달하는 사람을 피하기 위해 포인터를 취합니다. 세 번째 경우에는 스택에서 값을 허용하기 위해 참조를합니다.

이것을 어떻게 처리합니까? 또한 여기서 똑똑한 포인터에 의존해야합니까, 아니면 어떻게 든 알몸 참조와 포인터를 사용하여 그러한 것들을 표현할 수 있습니까?

도움이 되었습니까?

해결책

우리 팀은 당신이 제안한 것과 유사한 코딩 규칙을 가지고 있습니다.

1 -auto_ptr 인수는 클래스가 객체에 대한 메모리 관리를 제어한다는 것을 의미합니다. (우리는 이것을 많이 사용하지 않습니다.)

2 -Shared_ptr은 클래스가 아마도 오랜 시간 동안 인수를 사용할 것이며, 특히 자체 shared_ptr을 객체에 저장할 수 있음을 의미합니다.

3- 일반 참조는 인수가 통화 지속 시간에만 사용됨을 의미합니다.

우리는 이것을 코딩 표준으로 취급합니다. 그것은 우리가 각각의 전화에 대해 문서화하는 것이 아닙니다.

다른 팁

일반적인 관용구가 있는지 모르겠지만,이 정보를 제공하는 확실한 방법은 인터페이스 헤더의 주석이라는 것을 알고 있습니다. 수업 사용자는 항상 읽지 않고 항상 기억하지는 않으며, 깜박일 수있는 것보다 더 빨리 망칠 것이지만 정보가있을 것입니다.

이제, 나는 또한 시스템의 다른 부분이 소유하고있는 것에 대한 언급을 유지하는 것에 반대하는 것입니다. 클래스가 모든 것을 소유하도록 (또는 메소드 호출 반환 후 참조를 유지하지 않도록)를 재구성하는 것은 항상 실용적이지는 않지만, 일을하는 가장 안전한 방법이며, 하나는 발신자가 이해하기가 더 쉽습니다.

참조를 유지하는 데 큰 문제는 발신자가 이러한 것들을 파괴 할 수 없다는 것을 결코 기억하지 못하고 결국 '삭제 된 객체 사용'유형 고장으로 끝날 것입니다.

어쩌면 질문의 요점이 없을 수도 있지만 헤더 파일의 메소드 프로토 타입이 올바르게 설정되면 그렇게합니다.
"암시 적으로"사용자는 주어진 메소드가 매개 변수에 대한 참조 만 수락하거나 주어진 매개 변수가 읽기 전용 (const) 등을 알 수 있습니다 ....

문서화가 유일한 대답이지만 불행히도 유용한 대답은 아닙니다. 내가하고있는 연구는 많은 고객들이 사용하는 방법에 대한 문서를 읽지 않는다는 것을 보여줍니다.

적어도 자동 완성 창에서 볼 수 있기 때문에 메소드 이름이나 인수 이름의 명명법에 넣는 것이 좋습니다. 못 생겼지 만 메시지를 받는다 :)

내 도구 (Java/Eclipse의 경우)에는 매개 변수에 대해 중요한 것을 알아야 할 때 사용자에게 발표 할 수있는 태그가 있습니다.

Boost 또는 STL을 사용하는 코드로 작업하지 않습니다. 특히 잘 지원하는 시스템으로 작업하지 않지만 다음 표준이 유용하다는 것을 알았습니다 ...

Const 참조 및 값 매개 변수를 상호 교환 적으로 사용합니다. (값이 레지스터보다 큰 경우 참조를 사용합니다. 이것은 단순히 최적화입니다.) Callee는 필요한 경우 값으로 사본을 가져옵니다. 따라서 인수는 곧바로 파괴 될 수 있습니다. (사례 3)

Const Pointers를 사용하여 입력이 회의적이며 Callee는 참조로 사본을 가져옵니다. 논쟁의 수명은 칼리의 수명을 초과해야합니다. (사례 2)

나는 비 초가 포인터를 사용하여 입력이 회의적이며 Callee가 필요한 경우 Pointee를 수정한다는 것을 나타냅니다. 논쟁의 수명은 일반적인 경우 의도적으로 정의되지 않았습니다. (즉, 사례 2 또는 3)

나는 콜 포인트에서 무슨 일이 일어나고 있는지 명백하지 않기 때문에 순전히 비 정통 참조를 스스로 사용하지 않지만 이것은 단순히 내 개인적인 성향입니다. 내 이유가 있지만 다른 사람이 동의해야한다는 의미는 아닙니다! 따라서 Const 케이스에서 설명한 것처럼 수명을 나타내는 참조/포인터 구별을 유용하게 사용할 수 있습니다. 이 경우 포인터 = 사례 2 및 참조 = 사례 3 일 수 있습니다.

나는 의견에 따라 사례 1 (Callee가 소유권을 갖는다)을 나타냅니다. 이것은 내 코드에서 너무 걱정하지 않을 정도로 드물다.

객체 소유권을 나타 내기 위해 다음 메소드 접두사를 사용합니다. 소유권은 삭제에 대한 책임을 의미합니다.

Y.take_ZZZ(x)

발신자는 x의 소유권을 y로 제공하고 발신자는 x에 더 이상 액세스해서는 안됩니다. (y는 즉시 x를 삭제할 수 있기 때문에).

Y.own_ZZZ(x)

테이크와 비슷합니다. 발신자는 x의 소유권을 y로 제공하고 있지만 발신자는 x를 계속 참조 할 수 있으며 y는 즉시 x를 삭제하지 않을 것으로 예상합니다 (적어도 A Y가 존재하는 한 y는 y가 적어도 발신자가 알고있는 컨텍스트 전체에 걸쳐 존재할 것이라고 가정합니다. 와이). 일반적으로 Y는 y가 파괴 될 때까지 X를 삭제하지 않습니다 (Y는 소유권을 양도 할 수 있지만).

Y.know_ZZZ(x)

발신자는 X에 대한 포인터/참조를 제공하고 있습니다 (발신자 자체가 X 자체가 아니거나 아닐 수도 있음)이지만 y는 X의 소유권을 갖지 않습니다. Y는 X가 오래 존재할 것으로 예상 할 것입니다.

x = Y.provide_ZZZ()

x는 y가 소유 한 객체입니다. y는 발신자가 '알 수 있도록'객체에 대한 참조 (&)를 반환합니다. 객체는 처음에 필요할 때까지 널 포인터 일 수 있습니다. Y는 객체가 필요할 때까지 객체를 만들지 않을 수 있습니다. X가 동적으로 할당되는지 여부는 발신자로부터 숨겨져 있는지, y는 제공 할 객체의 인스턴스에 대한 참조를 반환하는 데 필요한 모든 것을 수행합니다. x는 Y가 존재하는 한 인스턴스화됩니다. 때로는 호출자가 y를 삭제할 수 있다고 말할 수 있도록 해당 방법 y.done_with_zzz (x)를 제공합니다.

x = Y.give_ZZZ()

Y는 발신자에게 X를 포기하고 더 이상 참조하지 않을 것입니다. 그런 다음 발신자는 X를 소유하고 X를 삭제하거나 다른 객체에 제공 할 책임이 있습니다.

x = Y.lend_ZZZ()

y는 발신자 (Know_zzz의 반대)에 대한 x에 대한 참조/포인터를 제공합니다. y는 소유권을 유지합니다. (제공과 유사하지만 y는 x를 인스턴스화하지 않으므로 x가 있고 참조 (포인터)를 반환하거나 NULL을 반환하지 않습니다.

x = Y.check_out_ZZZ() and Y.check_in_ZZZ(x)

체크 아웃을 사용하면 발신자가 체크인 할 때까지 발신자에게 x에 대한 독점 액세스 권한을 부여합니다.

x = Y.create_ZZZ()

Y는 X를 생성하고 즉시 발신자 (공장 기능)에게 포기합니다.

스마트 포인터를 사용하여 소유권을 더욱 강화할 수 있지만 일반적으로 더 복잡한 소유권 거래가 없다면 소유권의 범위가 현지화되지 않거나 개체가 진행되는 경우에도 스마트 포인터 없이이 명명 규칙을 사용합니다. 여러 객체에 의해 참조 (알려진).

명확성을 찾고 있다면 문서는 이것을 다루는 좋은 방법 중 하나입니다. 물론, 사람들이 당신의 문서에주의를 기울이라고 가정합니다.

알려진 사용 패턴이있는 기존 클래스를 사용하는 것 외에도 자신의 클래스를 만들 수 있습니다. 컴파일러가 일반 매개 변수에서 자동 생성 할 수있는 클래스 (물론 작성하는 연산자를 사용하여)를 사용하면 매개 변수를 전달하기가 더 어려워지지 않고 계약을보다 정확하게 지정할 수 있습니다. 이에 대한 단점 (추가 클래스, 사용자가보고 이해하고 이해할 수있는 더 많은 계층)이 있지만 고려해야 할 옵션입니다.

IntelliSense를 사용할 수있는 환경에있는 경우 필요한 정보가 매개 변수 설명에 있는지 확인하십시오. 그것은 다른 단계에서 당신을 구할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top