2016-08-26 2 views
0

이 내 회사는 C++의 참조 횟수 객체 구현하는 방법이다 : 당신이 참조 카운트 클래스를 만들 필요가 그래서C++ 참조 계산 : 매크로를 사용하여 이점을 얻으시겠습니까?

#ifndef DECLARE_REF_COUNT 
    #define DECLARE_REF_COUNT \ 
    public: \ 
     void Ref() { atomic_inc(_refs); } \ 
     void UnRef() { \ 
      int n = atomic_dec(_refs); \ 
      if (n <= 0) { \ 
       delete this; \ 
      } \ 
     } \ 
    private: \ 
     volatile int _refs; 
    #endif 

을, 당신이 할 : 당신이 그것을 사용하는 경우

class MyClass { 
DECLARE_REF_COUNT; 
public: 
     ... 
}; 

, 당신이 할 :

myobj->Ref(); 
... 
myobj->UnRef(); 

가 수동으로 참조하고 UnRef 필요하지 않는 내가, 내 선두 주자로 공유 포인터를 사용하여 제안,하지만 내 리더 매크로 방식을 선호 그는 UnRef()가 매우 기본적이고 우리가 이것을 잊지 않을 사람들을 고용하지 않기 때문에 UnRef()를 잊지 않을 것이라고 말했다. 매크로를 사용하는 또 다른 이유는 명시적인 Ref 및 UnRef가 필요할 때 더 많은 제어를 제공하기 때문입니다. 그래서 부스트가 없으며 C++ 11이 없다고 가정하면 매크로가 그렇게 할 수있는 좋은 방법일까요? 그리고이 방법의 장점과 단점은 무엇입니까?

+1

http://thedailywtf.com에 제출해야합니다. 정상적인 회사에서는 참조 횟수와 모든 메소드가 수퍼 클래스가되며 참조 카운트를 원하는 클래스는 그 클래스에서 상속받습니다. –

+5

"우리는 이것을하는 것을 잊어 버릴 사람들을 고용하지 않습니다"이것은 "나는 당신의 주장에 대해 신경 쓰지 않습니다"에 대한 일반적인 완곡 어법입니다. 상사가 마음을 바꾸게하는 논리적 인 논쟁은 없으니 그냥 해보십시오. – dasblinkenlight

+2

나는 '휘발성 (volatile)'이 당신을 돕기 위해 무엇인가를하고 있다고 생각하지 않는다. 상속하지 않으려는 경우를 제외하고는 다중 상속 "diamond"를 피하거나 템플릿 클래스를 작성하는 경우를 제외하고는 @SamVarshavchik을 참조하십시오. http://stackoverflow.com/q/8819095/10077 –

답변

1

모두가 귀하의 리더로서 자격을 갖춘 경우 스마트 포인터를 만들 필요가 없습니다.

그러나, 아아, 우리가했습니다.

매크로를 통해 기본 클래스를 권장합니다.

넘어
class RefCounted 
{ 
public: 
    void Ref() { ... } 
    void UnRef() { ... } 
private: 
    volatile int _refs; 
} 


class MyClass : public RefCounted 
또한

c++11의 핵심 신조 중 하나는 수동 자원 관리의 필요성을 줄일 수있다. std::shared_ptrstd::unique_ptr과 같은 것들이이 문제를 정확하게 해결하기 위해 만들어졌습니다. RAII 클래스는 C++ 11없이 작성 될 수 있으므로 강력히 권장됩니다.

+1

"스마트 포인터를 생성 할 필요가 없었습니다."-하지만 Unreef를 수동으로 호출하면 코드가 복잡해지고 실제 의도가 흐려지기 때문에 여전히 원할 것입니다. 사장님은 쉬운 일을하는 데 쓸모없는 코드를 쓰는 것을 좋아한다면 분명히 자격있는 사람이 아닙니다. –

+0

@SebastianRedl 충분합니다. 나는 지도자들이 'UnRef'를 부르는 것이 아무도 쉽게 그리워하지 않을 것이라고 주장한다. – lcs

+1

알아. 나는 보스의 진술이 어리석지 않더라도 똑똑한 포인터가 여전히 더 나은 선택이라는 지적을하고 있었다. –