2012-05-15 5 views
14

Tôi đã đọc qua số this similar question và thấy mình kém hài lòng hơn với các câu trả lời. Tôi không có một chức năng đơn giản gọi là "foo"; Tôi có một chức năng phức tạp hơn nhiều mà có những mối nguy hiểm rất thực tế nếu các tham số không được cung cấp một cách thận trọng. Nó có vẻ thích hợp hơn với tôi cho các chức năng để thực thi các quy tắc riêng của mình và đảm bảo hệ thống mạnh mẽ hơn để nghiêng về phía ý nghĩa ngữ nghĩa mà nhấn mạnh vào "một chức năng, một điều cần làm". Tôi nghĩ rằng những câu trả lời được ưu tiên đưa ra cho câu hỏi đó phản ánh chủ nghĩa lý tưởng lập trình được thực hiện quá xa, không phải thực tế của một số tình huống nhất định.Có thể chỉ định một std :: vector trống làm thông số mặc định không?

Những gì tôi phải đối mặt là:

void DoSomethingVeryComplex(const CRect bounds, CPoint startPoint = CPoint(-1,-1)); 

Bây giờ điều này xảy ra để đáp ứng các quy tắc ngữ nghĩa - nó đang làm một số điều, không phải một vài điều. Điều duy nhất nó đang làm xảy ra là phức tạp và đa giai đoạn, nhưng nó vẫn là một chuyện.

Đối với điều phức tạp đó, khuyên người dùng cung cấp giới hạn và để cho hàm xác định điểm bắt đầu của riêng nó. Người dùng cấp cao có thể muốn thực hiện phép toán đáng kể để xác định điểm bắt đầu thay thế cụ thể và nguồn cung cấp ... nhưng người dùng cẩn thận.

Và bây giờ tôi đã đến để thấy rằng trong những dịp hiếm hoi, nó có ý nghĩa để cung cấp không một, nhưng một số điểm khởi đầu. Điều này không thay đổi gì trong khái niệm ngữ nghĩa của quá trình liên quan, bởi vì quá trình này là một quá trình lan truyền từ điểm này sang hàng xóm khác, tới hàng xóm của hàng xóm, v.v. Vì vậy, bắt đầu từ nhiều điểm là một phần mở rộng tự nhiên.

Theo đó, tôi muốn để xác định:

void DoSomethingVeryComplex(const CRect bounds, 
          const std::vector<CPoint> startPoint /* = empty" */); 

để nếu vector rỗng, hàm xác định điểm bắt đầu như trước, và nếu có bất kỳ điểm trong vector, chúng được sử dụng như điểm bắt đầu.

Có sẵn cú pháp C++ cho phép tôi thực hiện việc này không - để chỉ định một mảng trống làm thông số mặc định?

Trả lời

23

Trong C++ 11, đó là đơn giản nhất:

const std::vector<CPoint> startPoint = {} 

Trước đó, điều này sẽ làm việc:

const std::vector<CPoint> startPoint = std::vector<CPoint>() 

Cả hai gọi constructor mặc định, mà tạo ra một vector rỗng. Lưu ý rằng cú pháp tương tự cũng có thể được sử dụng để gọi các hàm tạo khác, miễn là bạn điền vào các đối số thích hợp.

//this one has 5 default-constructed CPoints 
const std::vector<CPoint> startPoint = std::vector<CPoint>(5) 

Trong C++ 11, thậm chí bạn có thể điền vào một vector mặc định:

const std::vector<CPoint> startPoint = {CPoint(1, 2), CPoint(4, 5), CPoint(3, 9)} 

Nếu bạn muốn điều đó loại khả năng cho các lớp học của riêng bạn, here's a link on how it works.

+0

Đánh bại tôi. +1 – Martol1ni

+0

Cảm ơn! Tôi biết đã có một số cách để làm điều đó. Tôi không chắc chắn rằng tôi thực sự muốn làm điều đó - có thể rõ ràng hơn không để có một tham số mặc định ... nhưng có rất nhiều mã di sản để thay đổi nếu tôi loại bỏ tham số mặc định cũ. – omatai

+0

@omatai, thực sự nó rất tốt đẹp khi đi qua mã cũ để đưa nó lên tiêu chuẩn. – chris