デフォルトのコンストラクターがファイルパスをパラメーターとして受け取るクラスについて考えてみます。
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);
}
どうすればこれを機能させることができますか?
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]
コメントを追加