簡體   English   中英

指針向量的迭代器

[英]iterators for vector of pointers

我讀了另一篇文章,回答了關於指針向量的迭代器的問題。 我嘗試在我的代碼中使用相同的概念,但我收到一些編譯錯誤。 我基於代碼的代碼示例是:

vector<c*> cvect;
cvect.push_back(new sc);
vector<c*>::iterator citer;
for(citer=cvect.begin(); citer != cvect.end(); citer++) {
    (*citer)->func();
}

我想使用類似的概念為具有兩個數據成員的類創建深度復制構造函數,這兩個數據成員是指向對象的指針。 我的代碼與此類似:

class MyContainer {
    vector<MyStuff*> vecOne;
    vector<MyStuff*> vecTwo;

 public:
    MyContainer(const MyContainer& other);
};

MyContainer::MyContainer(const MyContainer& other) {
    // copy vector one
    vector<MyStuff*>::iterator vec1_itr;
    for (vec1_itr = other.vecOne.begin(); vec1_itr != other.vecOne.end(); vec1_itr++) {
        vecOne.push_back(new MyStuff(vec1_itr));
    }

    // copy vector two
    vector<MyStuff*>::iterator vec2_itr;
    for (vec2_itr = other.vecTwo.begin(); vec2_itr != other.vecTwo.end(); vec2_itr++) {
        vecTwo.push_back(new MyStuff(vec2_itr));
    }
}

我得到一些編譯錯誤,如:

/path/MyContainer.cpp:38:錯誤:' vec1_Itr = other->MyContainer::vecOne. std::vector<_Tp, _Alloc>::begin [with _Tp = MyStuff*, _Alloc = std::allocator<MyStuff*>]() ' operator= '不匹配vec1_Itr = other->MyContainer::vecOne. std::vector<_Tp, _Alloc>::begin [with _Tp = MyStuff*, _Alloc = std::allocator<MyStuff*>]() vec1_Itr = other->MyContainer::vecOne. std::vector<_Tp, _Alloc>::begin [with _Tp = MyStuff*, _Alloc = std::allocator<MyStuff*>]() '

候選人是: __gnu_cxx::__normal_iterator<MyStuff*, std::vector<MyStuff, std::allocator<MyStuff> > >& __gnu_cxx::__normal_iterator<MyStuff*, std::vector<MyStuff, std::allocator<MyStuff> > >::operator=(const __gnu_cxx::__normal_iterator<MyStuff*, std::vector<MyStuff, std::allocator<MyStuff> > >&)

我也為operator!=得到一個錯誤operator!= ...另一個向量的另一組相同的錯誤。

你忘了取消引用迭代器了。 試試這個:

vecOne.push_back(new MyStuff( **vec1_itr ));

編輯0:

是的,應該是雙重引用(在上面修復)。 它應該是const_terator因為你正在處理包含const的對象:

vector<MyStuff*>::const_iterator vec1_itr;

要么不將參數作為const要么將vec1_itr聲明為const_iterator 這里的問題是vecOne.begin()返回一個const_iterator因為容器是const 如果要更改容器,則必須刪除const限定符。

另外,如果持有一個指針容器意味着你需要管理容器中的指針而你有兩個這樣的容器,那么你應該將容器移動到它自己的類中。 盡量避免在類中管理多個資源。

內存泄漏警告!!

你的代碼本身就是漏洞。

從復制構造函數( std::bad_alloc ?)中拋出的任何異常都會導致內存泄漏,因為傳遞給vector的內存永遠不會被清除(析構函數不會被調用,因為對象永遠不會在第一個構造地點)。

當然,您可以添加所需的try/catch ,但我警告您,代碼很快就會變得笨重(您需要幾個)。

這是違反資源管理規則1的直接結果:

一個對象最多應該管理一個資源,在這種情況下它不應該做任何其他事情。

這意味着如果您的對象是業務對象(內部有應用程序邏輯),那么它不應該直接處理資源管理,而是使用現有的管理器。

在您的情況下,您有兩個解決方案:

  1. 建議 :因為你不在這里使用多態,所以不要使用指針。 std::vector<MyStuff>非常好
  2. 如果你需要多態,但沒有將它包含在這個玩具示例中,那么使用boost::ptr_vector<MyStuff>

加分點:它們中的兩個定義了合理的復制構造函數,賦值運算符和析構函數,因此您不必自己重寫它們。

編輯:

如@David所述,如果您需要多態性,則無法使用復制構造,因此需要:

  • clone方法或等效方法
  • 指針和動態內存分配

boost::ptr_vector提供了所需的一切( clone時自動使用clone方法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM