2012-07-06 2 views
0

클래스를 생성자에서 인수로 전달할 때 대부분 포인터가 전달됩니다. 추상 기본 클래스를 멤버로 처리 할 때 소유권 문제

// Abstract class A 
class A { 
    virtual void foo() = 0; 
}; 

class B : public A { 
    void foo(); 
}; 

class C { 
public: 
    C(A* a) : _a(a) {}; 
private: 
    A* _a; 
}; 
: 그 주된 이유는 여기에

은 예입니다 ... 내가 인스턴스화 할 수없는 추상 클래스를 통과해야하고, 참고로 난 정말 선택의 여지가 없어 null 일 수 없습니다입니다

어떤 경우에는 CA 개체를 처리하기를 원합니다 (삭제할 때 삭제). CA 개체를 삭제하지 않고 _a을 삭제하려고합니다.

사운드 프로그래밍 방법론을 사용하는 모범 사례는 무엇입니까?

+0

참조를 사용하십시오. '보기 전용 - 소유권 없음'을 표현할 때 정말 빛납니다. 실제로 null 값이 필요하면'boost :: optional '을 사용할 수 있습니다. –

+0

불행히도 추상 클래스에 대한 참조를 사용할 수 없습니다. 부스트 기능은 확실히 훌륭하지만 지금은 직장에서 사용할 수 없습니다. 문제를 해결할 순수 C++ 기능이 있습니까? – vanna

+1

당신은 확실히 [can] (http://ideone.com/fVwq7) 참조를 사용합니다. –

답변

2

shared_ptr을 사용하여 공유 소유권을 나타내고 unique_ptr을 사용하여 고유 소유권을 나타냅니다. C의 수명이 A 개체 (또는 A을 소유 한 다른 개체)의 수명으로 제한된다고 확신하는 경우 참조를 사용하거나 shared_ptr에 nil deleter를 사용할 수 있습니다.

+1

+1하지만 확실하지 않은 경우 참조는 옵션이 아닙니다. 참조는 클래스가 책임이 없음을 의미하므로 적어도 그렇게 많이 확신해야합니다. 확실하지 않으면'shared_ptr' 옵션이 더 좋습니다. –

관련 문제