Tôi muốn trả về hai giá trị, một trong số đó là một đối tượng mới. Tôi có thể làm điều này bằng std::pair
:Trả lại một đối tượng mới cùng với một giá trị khác
class A {
//...
};
std::pair<A*, int> getA()
{
A* a = new A;
//...
}
Để làm cho đoạn code ngoại lệ an toàn, tôi muốn làm:
std::pair<std::auto_ptr<A>, int> getA()
{
std::auto_ptr<A> a(new A);
//...
}
Nhưng điều này sẽ không biên dịch như auto_ptr
không thể sao chép mà không sửa đổi auto_ptr
đang được sao chép. Ok, điều này có nghĩa là auto_ptr
không sáng tác tốt như các loại khác (theo một cách khác). Một cách tốt để trả về một đối tượng mới trong trường hợp này là gì?
Một giải pháp thay thế là trả lại shared_ptr
và một cách khác là tham chiếu inout. Nhưng tôi đang tìm kiếm một số thay thế khác. Tôi có thể làm điều gì đó như:
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_;
};
Có cách nào tốt hơn không?
shared_ptr là hơi/trivially kém hiệu quả và virus. Không phải là những lập luận rất mạnh mẽ đối với shared_ptr, nhưng vẫn tạo ra một yếu tố chống lại chúng (trong 10% các trường hợp). –
may mắn thay, tiêu chuẩn tiếp theo chứa unique_ptr, có thể được di chuyển cùng với cặp chứa nó. –