2011-01-12 19 views
8

Tôi có các hàm khác nhau với hai đối số int (tôi tự viết cả hàm và mã gọi). Tôi sợ gây nhầm lẫn thứ tự tranh luận trong một số cuộc gọi.C++: sử dụng loại an toàn để phân biệt các kiểu đối số int2

Làm cách nào tôi có thể sử dụng loại an toàn để trình biên dịch cảnh báo cho tôi hoặc báo lỗi cho tôi nếu tôi gọi hàm có chuỗi đối số sai (tất cả đối số là int)?

tôi đã cố gắng typedefs: typedef không kích hoạt bất kỳ cảnh báo trình biên dịch hoặc lỗi:

typedef int X; typedef int Y; 

void foo(X,Y); 

X x; Y y; 

foo(y,x); // compiled without warning) 
+1

Bạn có thể tìm thấy một cái gì đó như thế này hữu ích: http://calumgrant.net/units/units.html –

Trả lời

12

Bạn sẽ phải tạo các lớp trình bao bọc. Cho phép nói rằng bạn có hai đơn vị khác nhau (nói, giây và phút), cả hai đều được biểu diễn dưới dạng int. Bạn sẽ cần một số thứ như sau để hoàn toàn an toàn:

class Minute 
{ 
public: 
    explicit Minute(int m) : myMinute(m) {} 
    operator int() const { return myMinute; } 

private: 
    int myMinute; 
}; 

và một lớp tương tự trong vài giây. Nhà xây dựng rõ ràng ngăn bạn tình cờ sử dụng int làm Minute, nhưng toán tử chuyển đổi cho phép bạn sử dụng Minute ở bất cứ đâu bạn cần int.

+5

Để thực hiện hoàn chỉnh hơn và chung chung, bạn cũng có thể xem http://www.boost.org/doc/libs /1_42_0/boost/strong_typedef.hpp – UncleBens

4

typedef tạo gõ bí danh. Như bạn đã khám phá, không có loại an toàn ở đó.

Một khả năng, tùy thuộc vào những gì bạn đang cố gắng đạt được, là sử dụng enum. Đó không phải là hoàn toàn an toàn, nhưng nó gần hơn. Ví dụ: bạn không thể chuyển int vào tham số enum mà không truyền tham số đó.

-5

Nhận ghi chú sau đó. Viết lên đó, bằng chữ lớn, "X FIRST! THEN Y!" Gắn nó vào màn hình máy tính của bạn. Tôi thành thật không biết những gì khác để tư vấn. Sử dụng các lớp bao bọc là chắc chắn quá mức cần thiết, khi vấn đề có thể được giải quyết với một bài đăng và một điểm đánh dấu ma thuật.

+5

Hỏi nhà phát triển phần mềm địa lý. Có lat/long hay long/lat? Một trường hợp cổ điển, nơi các lớp bao bọc làm việc và đăng nó không. – MSalters

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