2012-04-19 5 views
5

Tôi muốn xác định một số đặc tính như:viết hoa lá thư bằng C++ preprocessor (x -> GetX/setX)

#define property(T, x) T x; T get ## x(); void set ## x (T value); 

class foo { 
public: 
    property(int, count); 
    property(float, size); 
} 

nhưng tôi muốn các phương pháp được gọi là getCount/setCount và không getCount/setcount.

+2

Điều đó là không thể. Bạn có thể thay đổi macro của bạn mặc dù: 'property (int, count, Count)' (hoặc 'property (int, c, C, ount)' để giảm thiểu trùng lặp (không làm điều đó, nó là một trò đùa)) – Shahbaz

+1

This isn 't Java. Trong kiểu C++ được chấp nhận, các hàm nên được đặt tên là 'get_x()' và 'set_x()' (ngoại trừ chiều dài hoặc số đếm phải được đặt tên là 'size()' và 'resize()'). –

+3

Nếu - như macro của bạn đề xuất - biến của bạn là công khai, tại sao phải bận tâm với người truy cập? – Nick

Trả lời

3

Không có cách nào (mà tôi biết) để thực hiện việc này bằng bộ xử lý trước C. Tôi muốn đề xuất như là một sự thỏa hiệp, bạn đi cho một gạch dưới và sử dụng get_count() mà có thể dễ dàng đọc. Các lựa chọn thay thế khác:

  • Nếu bạn thực sự muốn gắn bó với bộ xử lý trước, bạn có thể điều tra bằng cách sử dụng m4 làm bước đầu tiên. Nó chắc chắn có thể với m4 vì tôi đã làm một cái gì đó rất giống nhau. Điều đó nói rằng, điều này có vẻ hơi phức tạp đối với những gì bạn muốn đạt được.
  • Thêm thông số bổ sung để bạn có được #define property(T, x, name) cho phép bạn chỉ định tên riêng biệt. Nó linh hoạt hơn nhưng có lẽ không phải là thứ bạn muốn.
  • Nếu nó thực sự là legwork của việc tạo ra accessors/mutators, có rất nhiều IDE và máy tạo mã sẽ làm điều đó cho bạn hoặc bạn có thể viết một số shell/Python/Perl để gõ này ra như một một off rất dễ dàng .

Hai quan sát cuối cùng: Mặc dù có vẻ hiệu quả hơn khi viết theo cách này, hãy nhớ rằng bất kỳ ai duy trì mã của bạn cũng có thể thực hiện tìm kiếm setCount() và không tìm thấy nó sẽ lãng phí thời gian cho đến khi họ tìm ra những gì bạn ' đã thực hiện. I E. từ quan điểm bảo trì mã, giữ cho nó đơn giản. Thứ hai, thực hành tốt để biểu thị các macro trong trường hợp trên, vì cách đó chúng dễ dàng được xác định như vậy. Một lần nữa điều này thực sự hữu ích khi bạn đang duy trì mã.

5

Khi nhận xét cho biết, bạn không thể làm điều đó. Preprocessor không làm những điều đó.

Vì vậy, bạn hãy làm theo những gì @Shahbaz đã nói trong bình luận đầu tiên, hoặc làm điều gì đó như thế này cho phép bạn nhận và đặt các mẫu get_countset_count.

#define property(T, x) private : T m_## x; \ 
public : T get_## x() { return m_## x;} \ 
void set_## x (T value) { m_## x = value; } 

class foo { 
public: 
    property(int, count); 
    property(float, size); 
}; 

int main() { 
     foo f; 
     f.set_count(10); 
     std::cout << f.get_count() << std::endl; 
     return 0; 
} 

Quick demo at ideone

Lưu ý rằng các biến được khai báo trong phần private và tên của nó là m_count, và các chức năng được định nghĩa (không chỉ tuyên bố) trong phần public.

Hoặc, bạn có thể vượt qua Count thay vì count trong vĩ mô như:

property(int, Count); 

Nếu bạn làm như vậy, sau đó bạn có thể tạo ra các biến như m_Count và có chức năng như getCountsetCount. Đó là gần nhất với những gì bạn muốn.