2011-11-30 72 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

您改为传递指针。由于无法将数组传递给函数,因此您的代码已经做到了这一点 - 编译器会默默地混淆将任何声明为数组的函数参数变为指针。

相关问题