我想要一個類物件陣列unique_ptr
:
std::unique_ptr<MyClass[]> arr(new MyClass[n]);
MyClass
沒有默認建構式(在我的情況下不應該有),所以我必須明確地把它放在這里。我不知道該怎么做,所以它在語法上是正確的。unique_ptr
撰寫具有顯式初始化的類物件陣列的正確方法是什么?
澄清
我有一個非默認建構式MyClass
,如下所示:
MyClass instance(arguments);
除了成員初始化之外,建構式中還有一些計算。我想創建一個實體unique_ptr
陣列MyClass
并為每個實體呼叫建構式。我以后不能這樣做,因為MyClass
沒有默認建構式。我可以放在(arguments)
某個地方std::unique_ptr<MyClass[]> arr(new MyClass[n])
嗎?
uj5u.com熱心網友回復:
下面的答案基于該問題的先前版本,其中陣列大小似乎是一個編譯時常量。如果創建的陣列的大小不是編譯時常量,則不可能將引數傳遞給元素的建構式。在這種情況下std::vector
,可能是比 array- 更好的選擇std::unique_ptr
。
它與陣列一樣,使用聚合初始化:
std::unique_ptr<MyClass[]> arr(new MyClass[]{
{...},
{...},
{...},
{...},
{...}});
其中...
由五個元素的建構式的引數串列替換。
或者,如果您不能對元素使用串列初始化,例如因為這會無意中使用std::initializer_list
建構式:
std::unique_ptr<MyClass[]> arr(new MyClass[]{
MyClass(...),
MyClass(...),
MyClass(...),
MyClass(...),
MyClass(...)});
std::make_unique
通常會首選創建std::unique_ptr
s,但目前沒有允許將引數傳遞給單個陣列元素的建構式的多載。
如果您想將相同的引數串列傳遞給每個元素,考慮到該型別是可復制構造的,一個簡單的解決方案是宣告一個實體,然后從該實體復制構造元素:
MyClass instance(arguments);
std::unique_ptr<MyClass[]> arr(new MyClass[]{instance, instance, instance, instance, instance);
否則,您可以撰寫一個模板函式來為您擴展這些重復項。(稍后可能會添加示例。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/470089.html