說我需要一個新的類型在我的應用程序,它由一個功能擴展的std::vector<int>
組成。直截了當的方法是組成(由於STL容器的繼承限制):通過組合或免費功能擴展STL容器?
class A {
public:
A(std::vector<int> & vec) : vec_(vec) {}
int hash();
private:
std::vector<int> vec_
}
這需要用戶首先構建一個vector<int>
並在構造函數的副本,這是當我們要應付一個壞相當大數量的大型矢量。當然,可以寫一個傳遞到push_back()
,但是這引入了可變狀態,我想避免這種狀態。
因此,在我看來,我們可以避免複製或保持不變,這是正確的嗎?
如果是的話,最簡單的(和效率明智當量)的方法是使用typedef和free函數在命名空間範圍:
namespace N {
typedef std::vector<int> A;
int a_hash(const A & a);
}
這只是感覺不對莫名其妙,因爲在未來將擴展「污染「命名空間。此外,在任何vector<int>
調用a_hash(...)
是可能的,這可能會導致意想不到的結果(假設我們施加約束上的一個用戶必須遵循或否則將在第一個例子執行)
我的兩個問題是:
- 在使用上面的類代碼時,如何不犧牲不變性和效率?
- 什麼時候使用自由函數而不是封裝在類/結構中有意義?
謝謝!
你在談論什麼「STL容器的繼承限制」?當然,它們不能以多態的方式派生,但是當你用包裝器確定時,你不需要這樣做。也就是說,如果你希望得到的對象是不可變的(當基類不是)時,繼承不是正確的工具。 – 2011-04-12 05:53:58
相關問題:http://stackoverflow.com/questions/679520/advice-on-a-better-way-to-extend-c-stl-container-with-user-defined-methods – 2011-04-12 06:01:17