2010-03-10 2 views
0

typedef으로 특정 유형을 캡슐화하는 것에 대해 빠른 질문이 있습니다. typedef를 사용하여 특정 유형을 완전히 숨기는 방법은 무엇입니까?

class Foo { 
public: 
    typedef boost::shared_ptr< std::vector<int> > value_type; 
    Foo(value_type val) : val_(val) {} 
private: 
    value_type val_; 
}; 

그러나이 경우

는, 주요 기능은 여전히 ​​(유형을 알고있다 그래서 명시 적으로 사용하고 : 나는 누구의 생성자 특정 값을 사용하는 클래스 Foo을 가지고,하지만 난 typedef를 사용하여 특정 유형을 숨기려면 말 std::vector<int>는) :
int main() { 
    Foo::value_type val(new std::vector<int>()); 
    val->push_back(123); 
    Foo foo(val); 
    return 0; 
} 

어떻게 해결할 수 여전히 Foo 생성자에서 벡터의 깊은 사본을 피하면서?

답변

6

다양한 솔루션 : 당신이 원하는 모든 그것을 복사하지 않고 외부 데이터에서 초기화 푸의 벡터 멤버가 대신 실제로 shared_ptr을 통해 공유하는 경우

Foo::value_type val(new Foo::value_type::element_type()); 
// least change from your current code, might be too verbose or too 
// coupled to boost's smart pointer library, depending on your needs 

Foo::value_type val(new Foo::element_type()); 
// add this typedef to Foo: typedef value_type::element_type element_type; 

Foo::value_type val = Foo::new_value_type(); 
// static method in Foo, allows you to even easily change from new (as you 
// encapsulate the whole smart pointer, and can specify another deleter to the 
// boost::shared_ptr) 

struct Foo { 
    static value_type new_value_type() { // function used above 
    return value_type(new value_type::element_type()); 
    } 
}; 

, 그때 사용하지 것이다 shared_ptr. Foo의 ctor에서 참조를 가져 와서 객체가 변경되었다는 것을 문서화하십시오.

struct Foo { 
    typedef std::vector<int> value_type; 
    explicit Foo(value_type& val) { 
    using std::swap; 
    swap(val, _val); 
    } 

private: 
    value_type _val; 
}; 

int main() { 
    Foo::value_type val; 
    val->push_back(123); 
    Foo foo(val); 
    return 0; 
} 
+0

감사합니다. 특히 'swap()'연산이 꼭 필요한 것입니다. – Frank

1

제공된 예제에는 딥 (deep) 복사본이 없습니다. shared_ptr은 복사되지만 하나의 벡터 만 만들어집니다. Foo 생성자 다음에 push_back을 두 번째 호출하고 Foo.val_도 변경되었음을 알면이를 확인할 수 있습니다.

+0

오해입니다. 나는 typedef 문제를 해결하기를 원했지만 깊은 복사는 도입하지 않았다. ('shared_ptr'은 처음부터 복사를 피하기 위해 사용되었습니다.) 나는 그것에 대해 더 명확하게 텍스트를 변경했습니다. – Frank

관련 문제