2011-11-30 57 views
2

如果我不需要副本,這是傳遞unique_ptrs數組的正確方法嗎?什麼是傳遞unique_ptrs數組的正確方法?

換句話說,我希望x發生的一切都會影響調用者的arr。

void doWork(unique_ptr<Foo> x[]) 
{ 
    // I want assignments to x to impact caller's arr 
} 

int main() 
{ 
    unique_ptr<Foo> arr[10]; 
    doWork(arr); 
} 

回答

10

您的代碼沒有真正的問題,因爲陣列衰變的指針當通過像這樣(由值)。然而,下面的肯定會更C++:

typedef std::vector<std::unique_ptr<Foo> > FooVec; // dynamic size 
typedef std::array<std::unique_ptr<Foo>, 10> FooArr; // fixed size (10) 

void doWork(FooVec& x) // or FooArr& 
{ 
    // I want assignments to x to impact caller's arr 
} 

int main() 
{ 
    FooVec vec(10); 
    FooArr arr; 
    doWork(vec); 
} 

換句話說,它相當於

void doWork(unique_ptr<Foo> *x) 

要停止衰減,通過引用傳遞:

void doWork(unique_ptr<Foo> (&x)[10]) 
+0

如果它是固定大小,如OP代碼所示,可以使用'std :: array ,10>'。 – Kleist

+1

@Kleist:你錯過了我的快速編輯:)我甚至通過ref'_ – sehe

+0

@sehe:tyvm投擲了_'C數組 - 我已經修改了我的代碼以更好地適應C++範例,正如你所建議的 – kfmfe04

0

你在做什麼對你想要的很好(雖然我不確定這是最好的設計)。

因爲數組衰減到當傳遞給功能和聲明爲接受陣列的功能的指針調整爲函數取指針,內部doWorkx是指向的unique_ptr<Foo>arr陣列中main和作業聲明到陣列的成員將在main中可見。

0

您改爲傳遞指針。由於無法將數組傳遞給函數,因此您的代碼已經做到了這一點 - 編譯器會默默地混淆將任何聲明爲數組的函數參數變爲指針。

相關問題