簡體   English   中英

將智能指針放置在STL容器中

[英]Placing smart pointers in an STL container

我有一個容器,我想填充指向C類的指針。但是,我寧願使用Boost shared_ptr而不是啞指針。

我將容器聲明為container<C*> ,但出現此錯誤:

  no known conversion for argument 1 from ‘boost::shared_ptr<C>’ to ‘C* const&’

我應該如何聲明該容器使用增強共享ptrs? 如果可能的話,我也希望它使用啞指針。


更新:從響應來看,似乎確實必須聲明容器采用智能指針,而不能使容器同時采用智能或啞指針。 也就是說,從聰明到愚蠢,反之亦然。 那是對的嗎?

這是一個使用C ++ 11共享指針的簡單工作演示。 它們類似於Boost共享指針。

#include <iostream>
#include <memory>
#include <vector>

int main( int argc, char* argv[] )
{
    // Create vector
    std::vector<std::shared_ptr<int>> buffer;

    for( int i=0; i<10; i++ )
        buffer.push_back(std::make_shared<int>(i));

    for( int i=0; i<10; i++ )
        if( (*buffer[i]) != i ){
            std::cout << "Match invalid for " << i << "." << std::endl;
            return 1;
        }
    std::cout << "Valid result" << std::endl;

    return 0;
}

我用這個編譯了

g++ main.cpp -o main -std=c++11

為了使用向量,您需要明確指定它們將要持有的對象的類型,在您的情況下將為boost::shared_ptr 我也了解您要在該容器中存儲啞指針。 如前所述,您的容器可以主要存儲一種類型,但是有一些例外情況,例如,這些類型是通過繼承或另一種機制(例如序列化)關聯的,當您嘗試使用這種機制時需要明確的向下轉換使用那些對象,或者類型是泛型類型。 永遠不會少。 這是另一種方法。 您不需要同時存儲智能指針和原始指針的向量,因為您始終可以從智能指針獲取原始/啞指針。 最好的方法是創建這樣的向量

std::vector<boost::shared_ptr<foo>> vec;

上面創建了一個向量,該向量將存儲指向foo的共享指針。

然后,只要有這樣的共享指針

 boost::shared_ptr<foo> foo_ptr(new foo());

你可以做這樣的事情

vec.push_back(foo_ptr)

當您需要啞指針時,可以執行此操作

foo* f = vec[0].get();

我閱讀了您所說的更新

……似乎確實必須聲明容器采用智能指針,而不能使它采用智能指針或啞指針。

您應該了解boost::shared_ptr<Type>是一個智能指針。

暫無
暫無

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

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