2011-06-18 33 views
7

Khi làm việc với native C++ trong Visual Studio, intellisense hiển thị các thành viên riêng và các hàm ngay cả khi nằm ngoài phạm vi của lớp chứa. Điều này khiến việc tạo các API sạch cho các lớp tôi viết trở nên khó khăn.Tại sao Visual Studio's intellisense hiển thị các thành viên và chức năng riêng tư?

Có lý do nào cho điều này không? Điều này có thể được ngăn chặn không?

+0

@Keoki Tôi sẽ cố gắng hơn một chút :) – aligray

+0

Bạn đang cố gắng ngăn điều này xảy ra khi khách hàng sử dụng mã của bạn? Tôi nghi ngờ điều đó là có thể. Nếu nó là một thiết lập trong MSVC, mỗi người sử dụng API của bạn sẽ cần phải bật nó. – RageD

+1

@Keoki: Có một số giải pháp Intellisense bên thứ 3 như Visual Assist X, nhưng không được tích hợp trong Visual Studio. – ildjarn

Trả lời

2

Vâng, tại sao nó không hiển thị riêng tư? Họ là thành viên, sau khi tất cả, họ tồn tại và họ hoàn toàn có thể truy cập từ ngữ cảnh nhất định, giống như bất kỳ thành viên khác. Nó sẽ rất khó cho IntelliSense để xác định xem các thành viên có thể truy cập hay không từ ngữ cảnh cụ thể này, đặc biệt là nếu bạn tính đến trong hầu hết các trường hợp ngữ cảnh này chưa hoàn thành (người dùng vẫn đang gõ nó lên)), có nghĩa là nó thường không thể phân tích nó.

+0

Tôi nghĩ tôi sẽ học cách sống với nó. – aligray

+4

Intellisense rất hiệu quả vì nó thu hẹp phạm vi cụ thể nhất có thể. Nếu mỗi khi bạn bắt đầu gõ nó cho thấy mọi lớp đơn trong mỗi không gian tên duy nhất trong mỗi assembly nó sẽ không hiệu quả. Thay vào đó, công việc là thu hẹp phạm vi càng nhiều càng tốt. Nó sẽ chỉ hiển thị các loại trong các assembly hiện đang được nạp và trong các không gian tên hiện đang được nhập.Khi chọn thành viên, nó chỉ hiển thị các thành viên nằm trong phạm vi, những người có thể truy cập công khai. – Despertar

+1

-1 Visual Studio sử dụng giao diện người dùng trình biên dịch EDG để hỗ trợ IntelliSense của nó. Không có gì khó khăn trong việc xác định cấp độ truy cập của bất kỳ biểu tượng cụ thể nào trong bất kỳ ngữ cảnh cụ thể nào. EDG cung cấp đầy đủ AST. – IInspectable

3

Lý do có lẽ chỉ có Microsoft mới biết. (Tôi nghĩ Intellisense không kiểm tra xem bạn đang ở đâu vào lúc này, vì vậy nó không biết bạn có ở trong lớp hay không (hoặc có thể truy cập vào các thành viên riêng tư) hoặc bên ngoài)

Tôi thực sự không biết liệu làm thế nào nó có thể được ngăn chặn.
Nhưng theo như tôi biết, họ có Biểu tượng có khóa để bạn biết rằng chúng là riêng tư. Có lẽ điều đó giúp

+1

Tất nhiên nó có thể được ngăn chặn. Intellisense trong C + + là hư không gần như tốt như nó là dành cho các dự án .NET. Cho trước, tôi chắc chắn sẽ khó thực hiện hơn cho C++. –

+1

@Ed S .: Bạn đã sử dụng nó trong VC 2010 chưa? Nó khá giống với .NET tại thời điểm này. –

+0

@ Billy: Thực ra đó là một điểm tốt và thật vui khi tôi bỏ nó ra. Tôi đã sử dụng VC10 tối qua lần đầu tiên và việc biên dịch nền và intellisense đều rất tốt đẹp. Đây là một dự án C, không phải C++, nhưng vẫn còn, rất tốt. –

0

Thật không may, điều này chỉ hoạt động đối với bất cứ điều gì bạn thực hiện, nhưng vẫn còn điều gì đó cần lưu ý nếu bạn sử dụng nhiều thư viện của riêng bạn.

Một điều tôi đã làm đối với bất kỳ thư viện nào tôi thực hiện là cố gắng lừa intellisense bằng #define. Trong tuyên bố lớp học của tôi trong tập tin tiêu đề cho bất cứ điều gì thư viện tôi đang làm, tôi bao quanh một phần toàn bộ tin trong một không gian #ifdef, ví dụ

#ifdef MYCLASS_SHOW_PRIVATE_VARIABLES 
private: 
    int hideThisVariable; 
    float noShow; 
    void HiddenIncrementFunction(); 
#endif 

Sau đó, trong phần mã của lớp mà tôi cần phải cung cấp các định nghĩa cho tất cả các phương pháp, ở phía trên trước khi đưa tập tin với các khai báo lớp, tôi thêm

#define MYCLASS_SHOW_PRIVATE_VARIABLES 

bằng cách này, các thành viên tin chỉ hiển thị cho những phương pháp bạn thực hiện cho lớp học của bạn trong file nguồn. Bất kỳ khách hàng nào sử dụng thư viện này sẽ không thể xem các biến riêng thông qua intellisense, trừ khi tất nhiên chúng xảy ra để xác định chỉ thị xử lý trước của bạn.

+2

Dude sẽ không thay đổi kích thước của các lớp học của bạn dựa trên việc xác định đó là có hay không? Nếu bất cứ ai stack phân bổ các lớp học của bạn, bạn sẽ được screwed. – deemen

+0

Tệ nhất. Ý kiến. Không bao giờ. Nhận một công cụ thích hợp có thể được điều chỉnh để cung cấp thông tin theo cách bạn cảm thấy thoải mái. Không điều chỉnh mã của bạn để bù đắp cho các công cụ kém. Và đừng bao giờ thay đổi mã của bạn theo cách hoàn toàn phá vỡ nó. – IInspectable

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