2017-04-25 13 views
1

固定サイズの配列への共有ポインタをベクトルに格納しようとしていますが、共有ポインタを使用したいのは、配列へのポインタを別のクラスに渡す必要があるからです。配列に書き込むと、複数の配列を持たせたいと思います。なぜなら、書き込みクラスのインスタンスが増え、書き込む配列が必要なため、配列内にたくさんのデータを書き込むので、それらを動かすことはできません。良いオプション。ベクトルの配列への共有ポインタの格納

std::shared_ptr<char> sp(new char [MAX_LENGTH], std::default_delete<char[]>()); 
arrayVect.push_back(sp); 

のようなベクターは、クラスのメンバとして定義されています。私は、エラーを取得しています

std::vector< std::shared_ptr< char [ MAX_LENGTH ] > > arrayVect; 

error: no matching function for call to ‘std::vector<std::shared_ptr<char [MAX_LENGTH]> >::push_back(std::shared_ptr<char []>&)’ 

私は別の選択肢を試してみましたが、それらのどれも働いていない、できましたあなたはそれを行う正しい方法を指摘していますか?または私が紛失している代替手段がありますか?書き込みクラスは書き込み関数用の文字配列を必要とするので、配列がついていると思います。

ありがとうございました!

+2

'のstd ::ベクトル<はstd :: shared_ptrの> arrayVect;' – CinCout

+1

は、単一文字への共有ポインタのベクトルではないWhould? *(arrayVect.at(0))[1] などのようなものにアクセスしたい場合はどうすればいいですか? –

+0

いいえ、それは単一の文字へのポインタにはなりません。実際には、配列は一般的にポインタに減衰します。 –

答えて

2

共有所有権が間違っているような気がします。概念的には、他の誰も結果をもう観察していない場合、なぜあなたの労働者がアレイ上で作業を続けたいのですか?

だから私はarrayVectの配列を所有し、作業者への配列へのポインタを渡します。配列の1つを保持することが意味をなさない場合は、まずワーカーを停止してから配列を削除します。

この動作を取得する最も簡単な方法は、arrayVectstd::vector<std::unique_ptr<std::array<char, MAX_LENGTH>>>にすることです。その後、char[MAX_LENGTH]配列のワーカーに渡すことができる配列へのポインタは、arrayVect[idx].get().data()を呼び出すことで取得できます。

unique_ptrで追加の間接参照を使用すると、ベクトルのサイズを変更しても配列へのポインタは有効のままです。

編集:ここではそれがunique_ptrで動作することができる方法の例である、あなたの労働者はまた、配列へのポインタを必要としていてもよ:

class Worker { 
public: 
    Worker(std::array<char, MAX_SIZE>* array) 
     : _array{array} { 
    } 

    void perform_work() { 
     function_that_requires_c_arrays(_array->data()); // maybe also a size parameter? 
    } 

private:  
    std::array<char, MAX_SIZE>* _array; 
}; 

int main() { 
    std::vector<std::unique_ptr<std::array<char, MAX_SIZE>>> arrayVect; 
    arrayVect.emplace_back(std::make_unique<std::array<char, MAX_SIZE>>())); 

    Worker w{arrayVect.back().get()}; 
    w.perform_work(); 
} 
+0

はmake_uniqueです。C++ 14?私はC++ 11しか持っていません: –

+0

@ JD.ggはい、そうではなく、 'arrayVect.emplace_back(new std :: array {});'。 – Corristo

+0

ありがとうございます! unique_ptrを使用するというアイデアは、shared_ptrよりも意味があります。 –

1

は実際に、あなたは間違ってベクトルを宣言している

std::vector<std::shared_ptr<char> > arrayVect;

、以下のように宣言するベクトルを試してみてください。上記の変更を試してみてください。それが役に立てば幸い!

1

あなたは配列表記なしstd::vector<std::shared_ptr<char>>を使用することができます。あなたは依然としてstd::default_delete<char[]>()をDeleterとして使用することが重要です。 完全な例を次に示します。

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

#define MAX_LENGTH 10 

int main() { 
    std::vector<std::shared_ptr<char>> arrayVect; 
    std::shared_ptr<char> sp(new char[MAX_LENGTH], std::default_delete<char[]>()); 
    arrayVect.push_back(sp); 
    arrayVect.push_back(std::shared_ptr<char>(new char[MAX_LENGTH], std::default_delete<char[]>())); 

    char q = 0; 
    for (size_t x = 0; x < arrayVect.size(); ++x) 
     for (size_t y = 0; y < MAX_LENGTH; ++y) 
      arrayVect.at(x).get()[y] = ++q; 

    for (size_t x = 0; x < arrayVect.size(); ++x) 
     for (size_t y = 0; y < MAX_LENGTH; ++y) 
      std::cout << int(arrayVect.at(x).get()[y]) << '\n'; // Int cast to print numbers, and not ASCII control characters 
} 
関連する問題