#include <iostream>
using namespace std;
#include "other_library.h"
struct Foo
{
Foo() { cout << "class\n"; }
};
int main()
{
Foo(); // or Foo() in any expression
}
Kết quả đầu ra này class
, hoặc vì vậy chúng tôi nghĩ. Vấn đề là nếu other_library.h
xảy ra để có một chức năng gọi là Foo
mà trở lại loại phù hợp để xuất hiện trong bất cứ biểu chúng tôi sử dụng Foo
trong sau đó nó âm thầm thay đổi hành vi, ví dụ:Chống lại sự nguy hiểm của tên lớp ẩn tên chức năng
int Foo() { cout << "func\n"; return 1; }
nguyên nhân func
là đầu ra mà không cần bất kỳ mã thay đổi trong main
. Điều này là xấu vì khả năng cho các lỗi phát hiện và khó phát hiện; ngay cả khi nó không phải là ý định độc hại trên một phần của other_library
, một cuộc đụng độ tên có thể không bị phát hiện.
Cách tốt nhất để giải quyết vấn đề này là gì? Ban đầu nó được nuôi dưỡng bởi Dan Saks in 1997, và one suggested resolution là tất cả lớp nên được typedef'd:
typedef struct Foo Foo;
như trình biên dịch không phải báo cáo một vụ đụng độ giữa một typedef tên và một tên hàm . Tuy nhiên điều này dường như không phổ biến - tại sao không?
Làm rõ: câu hỏi này là về các phương pháp hay để mã của chúng tôi ngừng thay đổi hành vi không bị phát hiện này xảy ra mà chúng tôi không nhận thấy. (Trái ngược với cách giải quyết nó khi chúng tôi nhận ra rằng điều đó đang xảy ra, điều này dễ dàng hơn - ví dụ: đổi tên lớp của chúng tôi).
Namespaces và Vệ sinh mã tốt là phương pháp ưa thích của tôi. – BlamKiwi
@MorphingDragon Tôi đoán vấn đề là những gì sẽ xảy ra khi bạn sử dụng mã cũ không nằm trong một không gian tên (như 'other_library.h' ở đây). Ngay cả khi bạn đặt mã của riêng bạn bên trong một không gian tên, bạn vẫn gặp rắc rối nếu làm việc bên trong không gian tên (hoặc 'sử dụng' nó). – vsoftco
Những gì tôi đã thấy là chức năng đặt tên với camelCase và các kiểu với CapitalCamelCase. Không có xung đột. – Quentin