Tôi đã thấy nhiều đối số sử dụng giá trị trả lại thích hợp hơn với các tham số ngoài. Tôi bị thuyết phục về lý do tại sao để tránh chúng, nhưng tôi thấy mình không chắc chắn nếu tôi đang chạy vào trường hợp mà nó là không thể tránh khỏi.Làm thế nào để tránh các tham số?
Phần một câu hỏi của tôi là: Một số cách yêu thích/phổ biến của bạn khi sử dụng tham số ngoài là gì? Các công cụ dọc theo các dòng: Man, trong đánh giá ngang hàng Tôi luôn thấy các lập trình viên khác làm điều này khi họ có thể dễ dàng thực hiện nó theo cách này.
Phần hai giao dịch câu hỏi của tôi với một số trường hợp cụ thể mà tôi gặp phải nơi tôi muốn tránh tham số ngoài nhưng không thể nghĩ ra cách làm sạch.
Ví dụ 1: Tôi có một lớp học với bản sao đắt tiền mà tôi muốn tránh. Công việc có thể được thực hiện trên đối tượng và điều này xây dựng lên các đối tượng được đắt tiền để sao chép. Công việc xây dựng dữ liệu không phải là chính xác tầm thường. Hiện tại, tôi sẽ truyền đối tượng này vào một hàm sẽ sửa đổi trạng thái của đối tượng. Điều này với tôi là thích hợp hơn để new'ing đối tượng nội bộ để các chức năng công nhân và trả lại nó trở lại, vì nó cho phép tôi để giữ cho mọi thứ trên stack. đang
class ExpensiveCopy //Defines some interface I can't change.
{
public:
ExpensiveCopy(const ExpensiveCopy toCopy){ /*Ouch! This hurts.*/ };
ExpensiveCopy& operator=(const ExpensiveCopy& toCopy){/*Ouch! This hurts.*/};
void addToData(SomeData);
SomeData getData();
}
class B
{
public:
static void doWork(ExpensiveCopy& ec_out, int someParam);
//or
// Your Function Here.
}
Sử dụng chức năng của tôi, tôi nhận được gọi như thế này:
const int SOME_PARAM = 5;
ExpensiveCopy toModify;
B::doWork(toModify, SOME_PARAM);
Tôi muốn có một cái gì đó như thế này:
ExpensiveCopy theResult = B::doWork(SOME_PARAM);
Nhưng tôi không biết nếu điều này có khả năng.
Ví dụ thứ hai: Tôi có một mảng đối tượng. Các đối tượng trong mảng là một kiểu phức tạp, và tôi cần phải làm việc trên từng phần tử, làm việc mà tôi muốn tách biệt khỏi vòng lặp chính truy cập từng phần tử. Mã hiện tại trông giống như sau:
std::vector<ComplexType> theCollection;
for(int index = 0; index < theCollection.size(); ++index)
{
doWork(theCollection[index]);
}
void doWork(ComplexType& ct_out)
{
//Do work on the individual element.
}
Bất kỳ đề xuất nào về cách xử lý một số trường hợp này? Tôi làm việc chủ yếu trong C++, nhưng tôi quan tâm để xem liệu các ngôn ngữ khác có tạo điều kiện cho việc thiết lập dễ dàng hơn hay không. Tôi đã gặp RVO như một giải pháp có thể, nhưng tôi cần phải đọc thêm về nó và nó có vẻ giống như một tính năng cụ thể của trình biên dịch.
Ngữ nghĩa của tham số tham chiếu không phải là (có thể) được thay đổi trong hàm. Nếu bạn sẽ không thay đổi nó, bạn sẽ vượt qua nó dưới dạng tham chiếu const. – Bill
* "nhưng tôi quan tâm để xem liệu các ngôn ngữ khác có tạo điều kiện dễ dàng hơn không" * - các ngôn ngữ như Java và C# đơn giản không có vấn đề đó vì chúng luôn tham chiếu đến các đối tượng xung quanh. –
Phản hồi tuyệt vời từ mọi người. Tôi có cảm giác rằng trong các ví dụ cụ thể của tôi rằng sẽ không có nhiều lựa chọn khác.Tôi đã nhìn thấy các bài đăng trên SO từ những người rất kiên quyết về cách họ tránh các thông số bằng mọi giá. Tôi đã hy vọng rằng có lẽ một trong số họ có thể giải thích về cách họ đạt được thành tích như vậy. Đối với RVO, tôi hơi do dự khi sử dụng các tính năng cụ thể của trình biên dịch, vì sẽ khó giải thích cho các ông chủ của tôi tại sao tôi cần phải thiết kế lại một nửa mã của tôi vì nó không còn hoạt động nữa do thiếu tính năng thay đổi/nâng cấp trình biên dịch. –