2012-02-15 66 views
10

Giả sử có một lớp C++. Và có một không gian tên chỉ hiển thị bên trong lớp của tôi. Phải làm gì cho điều đó?Tôi có thể khai báo "sử dụng không gian tên" bên trong một lớp C++ không?

class SomeClass 
{ 
    using namespace SomeSpace; 

public: 
    void Method1(); 
    void Method2(); 
    void Method3(); 
}; 

namespace SomeSpace 
{ 
    /*some code*/ 
}; 
+1

Chính xác thì ý bạn là gì? Không gian tên không giống như là riêng tư/công khai. – KillianDS

+0

Một tùy chọn là đặt lớp * bên trong * vùng tên. Nếu nó phụ thuộc quá nhiều vào không gian tên đó, tại sao nó lại ở bên ngoài? –

+0

Có thể trùng lặp của [Tại sao tôi không thể đặt tuyên bố "đang sử dụng" bên trong khai báo lớp?] (Https://stackoverflow.com/questions/2134844/why-cant-i-put-a-using-declaration-inside -a-class-declaration) –

Trả lời

7

using namespace X; được gọi là một using directive và nó có thể chỉ xuất hiện trong không gian tên và phạm vi chức năng, nhưng không phải là phạm vi lớp học. Vì vậy, những gì bạn đang cố gắng làm là không thể trong C + +. Điều tốt nhất bạn có thể làm là viết chỉ thị sử dụng trong phạm vi không gian tên của lớp đó, điều này có thể không được mong muốn.

Ngày nghĩ thứ hai, tuy nhiên, phân tích lời nói của bạn,

Giả sử có một ++ lớp C. Và có một không gian tên phải là chỉ hiển thị trong lớp học của tôi. Phải làm gì cho điều đó?

Tôi muốn đề xuất điều gì đó như sau, mà tôi không chắc chắn là những gì bạn muốn.

class A 
{ 
public: 
    void Method1(); 
    void Method2(); 
    void Method3(); 

private: 

    class B 
    { 
     //public static functions here, instead of namespace-scope 
     // freestanding functions. 
     //these functions will be accessible from class A(and its friends, if any) 
     //because B is private to A 
    }; 

}; 
+0

Các lớp lồng nhau có thể rất hấp dẫn vì chúng trông có vẻ thuận tiện như thế nào. Tuy nhiên, điều quan trọng - và tôi nghĩ thiếu sót - nhược điểm của các lớp lồng nhau là, giống như bất kỳ thành viên lớp nào khác, tất cả các thành viên của lớp lồng nhau đều có quyền truy cập đầy đủ vào tất cả các thành viên private/protected của lớp kèm theo. Đối với trường hợp (có lẽ là đa số?), Nơi đó không phải là mục tiêu cụ thể và lý do cho việc sử dụng các lớp lồng nhau, sau đó về cơ bản hoàn toàn phá vỡ đóng gói. –

0

Không nhưng bạn có thể làm điều đó như thế:

namespace SomeSpace 
{ 
    /*some code*/ 
}; 

using namespace SomeSpace; 

class SomeClass 
{ 

public: 
    void Method1(); 
    void Method2(); 
    void Method3(); 
}; 

Mặc dù nó không được khuyến khích hoặc để áp dụng bằng cách sử dụng chỉ thị không gian tên trong file header và thường được coi như một phong cách xấu. Bạn có thể đặt trong một tệp nguồn (.cpp) của lớp học của bạn.

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