2011-12-15 18 views
7

Tôi có rất nhiều cách sử dụng không gian tên trong danh sách khởi tạo và muốn sử dụng một không gian tên sử dụng để giảm độ dài. Tuy nhiên danh sách initialiser nằm ngoài phạm vi của các dấu ngoặc nhọn của hàm dựng nên tôi sẽ phải đặt bằng cách sử dụng bên ngoài hàm tạo và gây ô nhiễm phần còn lại của tệp với nó. Có cách nào để phạm vi sử dụng như tôi muốn không? Thay vì:sử dụng không gian tên chỉ dành cho danh sách khởi tạo

MyClass::MyClass() : 
    m_one(nsConstants::ONE), 
    m_two(nsConstants::TWO), 
    m_three(nsConstants::THREE) 
{} 

Tôi muốn:

MyClass::MyClass() : 
    using namespace nsConstants; 
    m_one(ONE), 
    m_two(TWO), 
    m_three(THREE) 
{} 

_

+1

Ngôn ngữ là gì? Vui lòng gắn thẻ một cách thích hợp. –

+0

Xin lỗi Tomasz, và cảm ơn vì đã bình luận. Đã chỉnh sửa để thêm thẻ C++. – Ant

+1

Để tránh nhầm lẫn nên gọi nó là "ctor-initializer" vì phần tử ngữ pháp C++ "initializer-list" là cái gì đó khác (phần giữa '{}' cho các bộ khởi tạo tổng hợp). Và những gì là xấu như vậy trong "gây ô nhiễm" phần còn lại của tập tin với việc sử dụng? Đó là tệp .cxx của bạn, không phải là tiêu đề vì vậy nó sẽ ổn. Một tùy chọn khác là làm 'sử dụng nsConstants :: ONE;', nhưng những gì bạn muốn là không thể. – PlasmaHH

Trả lời

4

Bạn không thể. Tiêu chuẩn này đưa ra một số giải pháp thay thế ít tốt:

// The stuff you want to use. 
namespace foo { namespace bar { 
    class Frob {}; 
} } 

Bây giờ, từ gây ô nhiễm nhất để gây ô nhiễm nhất.

typedef làm cho nó có thể viết thư bí danh trong một phần private của định nghĩa lớp học của bạn:

// I) 
class Schwarzschild { 
      typedef foo::bar::Frob FbFrob; 
public: Schwarzschild() : a(FbFrob()), b(FbFrob()) {} 
private: FbFrob a,b,c; 
}; 

Nhưng bạn cũng có thể sử dụng nó đơn vị trên toàn cầu, nhưng với một cơ hội để đổi tên nó:

// II) 
class Schwarzschild { 
public: Schwarzschild(); 
private: foo::bar::Frob a,b,c; 
}; 

// cxx-file 
typedef foo::bar::Frob FbFrob; 
Scharzschild::Scharzschild() : a(FbFrob()) {} 

Bạn cũng có thể không gian tên bí danh:

// III) 
namespace fb = foo::bar; 
class Planck { 
public: Planck() : a(fb::Frob()), b(fb::Frob()) {} 
private: fb::Frob a,b,c; 
}; 

Hoặc bạn anh đào có thể chọn biểu tượng từ không gian tên khác, với những bất lợi mà Frob của bạn có thể va chạm với một Frob trong đơn vị của bạn dịch:

// IV) 
using foo::bar::Frob; 
class Mach { 
public: Mach() : a(Frob()), b(Frob()) {} 
private: Frob a,b,c; 
}; 

Chỉ vì lợi ích của sự hoàn chỉnh, giải pháp gây ô nhiễm nhất là using namespace.

// V) 
using namespace foo::bar; 
class Newton { 
public: Newton() : a(Frob()), b(Frob()) {} 
private: Frob a,b,c; 
}; 

Lưu ý rằng III, IV và V cũng có thể bị giới hạn đối với tệp cxx của bạn, như trong ví dụ Schwarzschild.

+0

Cảm ơn bạn đã có câu trả lời rất đầy đủ, tôi có rất nhiều loại trong không gian tên có nghĩa là nhiều mã bổ sung trong I, II và IV. III rút ngắn không gian tên nhưng trong trường hợp của tôi nó đã ngắn và V là cái tôi muốn tránh. Vì vậy, trong trường hợp này tôi sẽ dính vào mã ban đầu của tôi. – Ant

0

Đây rõ ràng là không thể. Không tồn tại những thứ như "sử dụng cục bộ" trong C++. Vì vậy, bạn sẽ phải gắn bó với toán tử phạm vi hoặc sử dụng using.

+0

>> không có những thứ như "sử dụng cục bộ" trong C++. Vâng, tôi có nghĩa là: void myFunction() { bằng cách sử dụng không gian tên nsCác đối tượng; i = ONE; } có trong C++. Xem nhiều mục khác trên stackoverflow để biết chi tiết. (Xin lỗi, tôi không thể định dạng mã này làm mã.) – Ant

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