我想返回两个值,其中一个是新对象。我可以使用std::pair
:
class A {
//...
};
std::pair<A*, int> getA()
{
A* a = new A;
//...
}
为了使代码异常安全,我想这样做:
std::pair<std::auto_ptr<A>, int> getA()
{
std::auto_ptr<A> a(new A);
//...
}
但是这不会编译,因为如果不修改被复制的auto_ptr
就无法复制auto_ptr
。好的,这意味着auto_ptr
不像其他类型那样构成(再一次)。在这种情况下返回新对象的好方法是什么?
另一种方法是返回shared_ptr
,另一种方法是输入参考。但我正在寻找其他替代方案。我可以这样做:
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_;
};
有更好的方法吗?
答案 0 :(得分:5)
有两种主要方法可以解决这个问题:
shared_ptr
。 auto_ptr
在这些情况下并不真正起作用,但新标准和Boost都包含符合您要求的引用计数指针。让我们知道您对shared_ptr
不喜欢什么,也许我们可以提出另一种选择。
答案 1 :(得分:3)
shared_ptr
在这种情况下是理想的,但是如果你真的不想使用它们,你可以将auto_ptr
返回给包含对象和int的对。
答案 2 :(得分:2)
只需创建一个新类并返回该类
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);
}
答案 3 :(得分:1)
它不漂亮,但你可以通过指针或引用参数返回另一个值:
int i;
std::auto_ptr<A> a = getA(&i);
答案 4 :(得分:1)
为什么不通过两个参考参数?
class AGetter
{
// ..
void get(std::auto_ptr<A>& a, int& i)
{
a = a_.release();
i = i_;
}
// ..
};