2013-06-07 41 views
6

Tôi có C++ project. Tôi làm việc trên dự án để tự dạy mình về việc xây dựng một chương trình bán thực tế trong C++. Nó tải nội dung đệ quy từ một trang web.C++ Đại diện cho các đối tượng tùy chọn

Mỗi lần tải xuống có URL để tải xuống nội dung, cũng như URL cho liên kết giới thiệu (hoặc URL của trang được trích xuất nội dung).

Luôn có giới thiệu trừ khi đó là URL đầu tiên. Tôi đã lừa dối và chỉ coi URL đầu tiên là liên kết giới thiệu của riêng mình. Gần đây tôi đã thay đổi lớp URL để có một biểu diễn trống (hoặc trống). Điều này cảm thấy như một hack.

Có cách nào để đại diện cho đối tượng không bắt buộc trong C++ mà không:

  • Sử dụng con trỏ?
  • Không gian lãng phí cho đối tượng không hợp lệ?
  • hoặc Tạo phiên bản "trống" của đối tượng?
+0

W \ O: Sử dụng con trỏ? IMHO không. – Najzero

Trả lời

5

Bạn có thể sử dụng tăng :: tùy chọn. boost là thư viện của bên thứ 3 được tôn trọng; thường được coi là một nguyên mẫu cho các chức năng mới của stl: Xem câu trả lời của Ralph std :: tùy chọn có sẵn với C++ mới.

Xem http://www.boost.org/

+0

Tôi ban đầu đăng rằng đó là một bình luận, nhưng sẽ không lãng phí không gian cho phiên bản "trống"? Không phải là tôi nghĩ rằng đó là một vấn đề nghiêm trọng, nhưng nó là một trong những yêu cầu cụ thể của câu hỏi. – BoBTFish

+2

No. boost :: tùy chọn sử dụng một con trỏ, thiết lập để NULL là thích hợp, trong việc thực hiện nó. Không biết làm thế nào std :: tùy chọn hoạt động. – Bathsheba

+0

@Bathsheba Tôi chỉ đang cố gắng tránh tái phát minh các quy ước đã được thiết lập. Tôi đã sử dụng 'unique_ptr' nhưng quyết định nó làm cho mã trông lopsided. Tôi cảm thấy nó không rõ ràng là "trường này là tùy chọn". Thay vào đó, nó trông giống như một kỹ thuật quản lý bộ nhớ. –

5

Sử dụng std::optional mẫu, nếu bạn có một trình biên dịch C++ 14. Nếu không, bạn có thể sử dụng boost::optional hoặc std::unique_ptr. Bạn không thể tránh cả việc sử dụng con trỏ và lãng phí không gian cho đối tượng không hợp lệ. std::optional sẽ chứa đối tượng tùy chọn, std::unique_ptr rõ ràng sẽ trỏ đến nó.

+0

+1 cho bạn Ralph: Tôi thực sự cần chuyển sang C++ mới hơn ;-) – Bathsheba

Các vấn đề liên quan