2012-06-12 41 views
5

Tôi đang sử dụng thư viện có các lớp học với một số enums. Dưới đây là ví dụSử dụng enums từ một lớp học (C++)

class TGNumberFormat 
{ 
    public: 
    // ... 
    enum EAttribute { kNEAAnyNumber 
    kNEANonNegative 
    kNEAPositive 
    }; 
    enum ELimit { kNELNoLimits 
    kNELLimitMin 
    kNELLimitMax 
    kNELLimitMinMax 
    }; 
    enum EStepSize { kNSSSmall 
    kNSSMedium 
    kNSSLarge 
    kNSSHuge 
    }; 
    // etc... 
}; 

Trong mã, tôi phải tham khảo các ví dụ này là TGNumberFormat::kNEAAnyNumber. Tôi đang viết một GUI sử dụng các giá trị này rất thường xuyên và mã đang xấu đi. Có cách nào tôi có thể nhập các enums và chỉ cần gõ kNEAAnyNumber? Tôi không thực sự mong đợi bất kỳ cái tên nào trùng lặp. Tôi đã thử nhiều cách sử dụng từ khóa using và không có cách nào sẽ biên dịch.

+4

Tôi sẽ sử dụng một địa phương typedef để chức năng (ví dụ 'typedef TGNumberFormat NF; ', cho phép, ví dụ,' NF :: kNELLimitMin') . Mặc dù, tôi cho rằng tốt hơn là nên gõ tên. –

+0

'struct X: TGNumberFormat {};'. Sau đó, bạn có thể sử dụng chúng như 'X :: kNEAAnyNumber'. Tôi không khuyên bạn nên làm điều này, vì 'TGNumberFormat' (có vẻ bề ngoài) có ý nghĩa hơn bất kỳ tên ngắn nào bạn đưa ra cho' X'. – Praetorian

Trả lời

8

Nếu bạn đang sử dụng các hằng số này trong mã của mình, có thể có ích khi tạo tiêu đề của riêng bạn xác định lại các giá trị trong không gian tên. Sau đó, bạn có thể using không gian tên đó. Bạn không cần phải xác định lại tất cả các giá trị, chỉ cần tên của các điều tra viên. Ví dụ:

namespace TGEnumerators 
{ 
    static EAttribute const kNEAAnyNumber(TGNumberFormat::kNEAAnyNumber); 
    // etc. 
} 

Hoặc bạn có thể nhập TGNumberFormat vào tên ngắn hơn trong các chức năng hoặc tệp nguồn nơi bạn sử dụng thường xuyên. Ví dụ:

typedef TGNumberFormat NF; 
NF::EAttribute attribute = NF::kNEAAnyNumber; 

Tôi cho rằng cách tiếp cận thứ hai vượt trội hơn, và nếu được sử dụng một cách khôn ngoan ở phạm vi khối, là cách thực hành tốt. Tuy nhiên, để sử dụng trên một tập tin, tôi nghĩ rằng nó sẽ là thích hợp hơn để sử dụng tên đầy đủ của các điều tra viên, cho rõ ràng.

+0

+1 Tôi không thể đếm bao nhiêu lần tôi đã nhìn thấy một điều tra viên trần và tự hỏi nơi trên trái đất nó đến từ bởi vì nó đã được ẩn bởi một 'typedef' hoặc' sử dụng 'lén lút. –

+1

Chỉ cần một nhận xét nhỏ: cho redifinition giá trị (phương pháp đầu tiên của bạn), tôi nghĩ rằng nó là tốt hơn để sử dụng 'static const EAttribute' thay vì đồng bằng' EAttribute'. – Synxis

+0

Tại phạm vi không gian tên là điểm làm cho nó 'tĩnh' là gì? –

0

Nếu sử dụng của bạn C++ 11 bạn có thể sử dụng ô tô từ khóa để suy ra các loại:

//the compiler will see auto and know to use: TGNumberFormat::EAttribute 
auto attribute = TGNumberFormat::kNEAAnyNumber; 

biên soạn với: g ++ -std = C++ 0x -o main.cpp chính

Nếu bạn không sử dụng C++ 11, hãy cân nhắc việc sử dụng typedefs như đã đề cập bởi @James McNellis
bằng cách sử dụng macro không được khuyến nghị vì chúng sẽ không tuân thủ các quy tắc phạm vi-- typedefs sẽ.

0

Một cách khác đó là có thể nhưng liên quan đến một chút việc lên phía trước là để xác định một loạt các consts mà bạn sau đó sử dụng thay vì:

ví dụ

const TGNumberFormat::EAttribute AnyNumber = TGNumberFormat::kNEAAnyNumber; 
const TGNumberFormat::EAttribute NonNegative = TGNumberFormat::kNEANonNegative; 
... 

attribute = AnyNumber; 
0

Hai giải pháp:

  1. Sống với nó.
  2. #define AnyNumber TGNumberFormat::kNEAAnyNumber

* Chạy cho bìa ... *

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