Visual Studio 2017を使用して、C ++でパラメーター化されたオブジェクトの配列に一意のポインターを使用するにはどうすればよいですか?

マジス

デフォルトのコンストラクターがファイルパスをパラメーターとして受け取るクラスについて考えてみます。

class Test
{
    public:
         Test(const std::string& filepath);
    ...
    ...
};

ここTestで、VS2017で一意のポインターを使用してオブジェクトの配列を作成および初期化したいと思います。

int main()
{
    std::unique_ptr<Test[]> m_Tests;
    int testCount = 2;
    std::string path1, path2;

    m_Tests = std::make_unique<Test[]>(testCount);    // This line gives a compilation error
    m_Tests[0] = std::make_unique<Test>(path1);
    m_Tests[1] = std::make_unique<Test>(path2);
}

どうすればこれを機能させることができますか?

JędrzejDudkiewicz

g ++ 9.2.0は、デフォルトのコンストラクター、つまりパラメーターのないコンストラクターがないことを示しています。このようなコンストラクターの追加は正常に機能します。必要なものでない場合は、unique_ptrの配列を作成できます。std::unique_ptr<std::unique_ptr<Test>[]>その後、各要素を手動で初期化します。これは次のようになります。

#include <memory>
#include <algorithm>
#include <iostream>

struct Test {
std::string str_;
Test(std::string const& str) : str_(str) { }
void print() { std::cout << str_ << '\n'; }
};

int main()
{
    std::unique_ptr<std::unique_ptr<Test>[]> m_Tests;
    int testCount = 2;
    std::string path1{"a"}, path2{"b"};

    m_Tests = std::make_unique<std::unique_ptr<Test>[]>(testCount);
    std::array<std::string, 2> paths{path1, path2};
    std::transform(paths.begin(), paths.end(), &m_Tests[0],
        [](auto const& p) { return std::make_unique<Test>(p); });

    for (int i = 0 ; i < testCount ; ++i) {
            m_Tests[i]->print();
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ