我想返回两个值,其中一个是一个新对象.我可以这样做std::pair:
class A {
//...
};
std::pair<A*, int> getA()
{
A* a = new A;
//...
}
Run Code Online (Sandbox Code Playgroud)
为了使代码异常安全,我想做:
std::pair<std::auto_ptr<A>, int> getA()
{
std::auto_ptr<A> a(new A);
//...
}
Run Code Online (Sandbox Code Playgroud)
但是这不会编译,因为在auto_ptr不修改被复制的情况下无法auto_ptr复制.好吧,这意味着auto_ptr不像其他类型那样构成(再一次).在这种情况下返回新对象的好方法是什么?
一种选择是返回a shared_ptr而另一种是inout引用.但我正在寻找其他替代方案.我可以这样做:
class AGetter
{
void getAExecute()
{
//...
// set a_ and i_
}
std::auto_ptr<A> getA() const
{
return a_.release();
}
int getInt() const
{
return i_;
}
private:
std::auto_ptr<A> a_;
int i_;
};
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
有两种主要方法可以解决此问题:
shared_ptr.auto_ptr正如你所发现的那样,在这些类型的情况下并没有真正起作用,但新标准和Boost都包含了你想要的引用计数指针.让我们知道你不喜欢什么shared_ptr,也许我们可以建议一个替代方案.
只需创建一个新类并返回该类
class Result
{
A* a;
int i;
public:
Result( A*a, int i ) : a(a), i(i) {
}
~Result() {
delete a;
}
// access functions, copy constructor, ...
};
Result getA() {
//...
return Result(new A, intValue);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |