2010-03-10 50 views
0

我有一個關於使用typedef封裝特定類型的快速問題。說我有一個類Foo其構造函數採用一定的價值,但我想用typedef隱藏特定類型:如何完全使用typedef隱藏特定類型?

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

但在這種情況下,主要的功能還是必須知道的類型(所以它的明確使用std::vector<int>):

int main() { 
    Foo::value_type val(new std::vector<int>()); 
    val->push_back(123); 
    Foo foo(val); 
    return 0; 
} 

我怎樣才能解決這個問題,同時還避免了Foo構造向量的深層副本?

回答

6

各種解決方案:

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()); 
    } 
}; 

但是,如果你想要的是有來自外部的數據初始化Foo中矢量成員不復制它,而不是通過一個shared_ptr實際上共享,那麼我不會用一個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 2010-03-10 03:57:34

1

在提供的示例中沒有深層副本。 shared_ptr被複制,但只有一個創建的向量。您可以通過在Foo構造函數之後第二次調用push_back並注意到Foo.val_也發生更改來確認此事。

+0

這是一個誤解。我的意思是我想修復typedef問題,但不介紹深度複製。 ('shared_ptr'被用來避免首先複製。)我改變了文字,使其更加清晰。 – Frank 2010-03-10 03:25:45