2009-08-10 53 views
3

比方說,我有一個包含類類型「XX」 STL的載體。 xx是抽象的。我遇到了這個問題,其中編譯器不會讓我「實例」當我這樣做如下:STL vector.push_back()抽象類不會編譯

std::vector<xx> victor; 
void pusher(xx& thing) 
{ 
    victor.push_back(thing); 
} 

void main() 
{ 
    ; 
} 

我想這是因爲拷貝構造函數必須被調用。我通過在向量中存儲xx *而不是xx來解決這個問題。有更好的解決方案嗎?它是什麼?

回答

12

當您使用push_back,你可以將這個對象的副本,並將其存儲在向量。正如你猜測的那樣,這是行不通的,因爲你不能實例化一個抽象類,這基本上是複製構造的功能。

建議使用指針,或者使用類似boostloki等庫中的許多智能指針類型之一。

+7

但*不*使用std :: auto_ptr。由於其奇怪的複製語義,這些不能放入STL容器。 – 2009-08-10 18:27:24

+5

你也可以使用升壓轉換器的ptr_vector - http://www.boost.org/doc/libs/1_39_0/libs/ptr_container/doc/ptr_container.html – bdonlan 2009-08-10 18:30:02

+1

只是爲了澄清,使用你基本上覆制XX的狀態STL向量時然後當你檢索它時,C++將首先實例化xx,然後用適當的屬性填充它?而不是指向舊的對象。所以整個問題是我們最終使用xx的構造函數? – Ori 2009-08-10 19:51:40

0

的std ::矢量(和一般的整個STL)被設計來存儲值。如果你有一個抽象類,你不打算操縱這個類型的值,而是操縱指針或對它的引用。所以有一個抽象類的std :: vector是沒有意義的。即使它不是抽象的,通常不會操作被設計爲基類的類作爲值,它們通常應該是不可覆蓋的(複製構造函數和賦值運算符聲明爲私有,而未實現是標準技巧,繼承自一個合適的類,其唯一目的是使其後代不可複製 - 例如boost :: noncopyable - 已成爲時尚)。

2

比教皇更天主教(或在這種情況下,史蒂夫圭迪)存儲在STL容器中的對象的要求是它們拷貝施工的,可轉讓的和抽象類是既不。所以在這種情況下,一個指針的容器是要走的路。 另一件需要考慮的事情是,如果你決定通過不抽出課程來解決問題,將會是slicing

相關問題