2016-04-30 4 views
1

私はunique_ptrで配列を使用しようとしていますが、成功しません。
いくつかのサイズのunique_ptrを宣言する正しい方法は何ですか?
(サイズは一部のパラメータです)ここでC++のunique_ptrと配列

unique_ptr<A[]> ptr = make_unique<A[]>(size); 

は例です:

#include <iostream> 
#include <string> 
#include <vector> 
#include <functional> 
#include <memory> 

using namespace std; 

class A { 
    string str; 
public: 
    A(string _str): str(_str) {} 
    string getStr() { 
     return str; 
    } 
}; 

int main() 
{ 
    unique_ptr<A[]> ptr = make_unique<A[]>(3); 
} 

これは私がAのコンストラクタを削除した場合、それは動作しますが、しかし、機能していません。
私は3の配列のサイズを表現し、Aのコンストラクタの引数ではなく、どのようにしてそれを起こさせたいのですか?

+0

ヒント動作するはずです:使用4つのスペースのインデントを使用していないのはなぜコード – Drop

+1

としてテキストをマークするが'std :: unique_ptr > ptr = make_unique >(3);'? –

+0

または代わりに 'std :: unique_ptr > ptr = make_unique >();' –

答えて

1

これは機能しませんが、Aのコンストラクタを削除すると、 が機能します。

ユーザー定義コンストラクターを削除すると、コンパイラーは暗黙的にデフォルトのコンストラクターを生成します。ユーザー定義コンストラクターを指定すると、コンパイラーは暗黙的にデフォルトコンストラクターを生成しません。

std::make_unique<T[]>は1を提供し、だから... ...

をデフォルトのコンストラクタを使用する必要があり、すべてがうまく

#include <iostream> 
#include <string> 
#include <vector> 
#include <functional> 
#include <memory> 

using namespace std; 

class A { 
    string str; 
public: 
    A() = default; 
    A(string _str): str(_str) {} 
    string getStr() { 
     return str; 
    } 
}; 

int main() 
{ 
    unique_ptr<A[]> ptr = make_unique<A[]>(3); 
} 
+0

この場合、3はptr?のサイズを表します。つまり、ptrには3つのポインタが含まれていますか? – user5618793

+1

@ user5618793これは答えです。クラスに他のコンストラクタが存在しない場合、暗黙的に定義されたデフォルトのコンストラクタが存在するため、ユーザ定義のコンストラクタをコメントアウトするときにコードが機能します。 –

+0

@bku_drytt私が知っているのは、私のコードではA() ' - 空のコンストラクタが使用されていないので、エラーを理解できません – user5618793