2012-01-12 17 views
8

Nếu tôi có đoạn mã sau:Tôi có thể bí danh biến mà không làm phát sinh chi phí lưu trữ của tham chiếu không?

struct someStruct 
{ 
    int x; 
    int y; 
} 

class someClass 
{ 
    public: 
    someStruct m_member; 

    alias  m_x = m_member.x; // I am aware alias is not a keyword and even if it was, I cannot assign it a value like this 
    alias  m_y = m_member.y; // I am aware alias is not a keyword and even if it was, I cannot assign it a value like this 
} 

Tôi có thể cung cấp cho bí danh để m_member.xm_member.y mà không bị chi phí lưu trữ thêm một tài liệu tham khảo (mà là giống như một con trỏ)? Một cái gì đó tương tự như một typedef?

+1

Không có. Từ khóa 'bí danh' như vậy chắc chắn sẽ có giá trị khi bạn muốn từ bỏ tên cũ mà không vi phạm mã hiện tại hoặc để tạo thành một cấu trúc dữ liệu một cách minh bạch. D vui vẻ có từ khóa "bí danh", và C++ đã "sử dụng", nhưng thật đáng buồn chỉ hoạt động đối với tên loại chứ không phải tên trường. Tôi hy vọng C++ một ngày nào đó chấp nhận khả năng của D (nhưng nó có thể sẽ thông qua từ khóa "sử dụng" thay vì "bí danh"). –

Trả lời

10

Bạn có thể viết các chức năng truy cập nội tuyến:

class someClass 
{ 
public: 
    someStruct m_member; 
    int& mx() { return m_member.x; } 
    int& my() { return m_member.y; } 
    int const& mx() const { return m_member.x; } 
    int const& my() const { return m_member.y; } 
}; 

Sau đó, bạn có thể truy cập các thành viên như sau:

someClass foo; 
foo.mx() = 3; 
foo.my() = 2*foo.mx(); 

Nó không phải chính xác cùng cú pháp, nhưng đóng, và một trình biên dịch hợp lý tốt sẽ mpletely tối ưu hóa các chức năng nội tuyến.

+1

+1 Có lẽ ít nhất là tệ nạn ... –

+0

Đó là một thỏa hiệp tốt (+1), tôi nghĩ tôi có thể sống với điều này. – Samaursa

+2

+1, nhưng cũng nên có phiên bản 'const'. –

1

Trong trường hợp này, tôi sẽ chỉ sử dụng tham chiếu vì đó là những gì chúng phù hợp. Nếu một chi phí tham chiếu thực sự là quá nhiều, tôi sẽ từ bỏ bí danh và sử dụng biểu thức đầy đủ.

Tuy nhiên bạn có thể đạt được điều này với một macro (đọc: ác)

class someClass 
{ 
    public: 
    someStruct m_member; 
#define m_x m_member.x 
#define m_y m_member.y 

    ... 

#undef m_x 
#undef m_y 
}; 

Tôi rất muốn giới thiệu không làm điều này mặc dù. Giống như tất cả các macro mặc dù nó có một số hậu quả không mong muốn (có thể gây ra tham chiếu sai cho các mục đích hợp lệ khác của m_x trong loại).

Ví dụ

struct s1 { 
    int m_x; 
}; 

class someClass { 
public: 
    someStruct m_member; 
#define m_x m_member.x 
#define m_y m_member.y 

    ... 
    void Example(S1& s1) { 
    s1.m_x = 42; // This wouldn't compile and you'd get terrible error messages 
    } 
}; 
+1

Lưu ý rằng nếu bạn '# undef' các macro trong lớp, khách hàng không thể sử dụng chúng. Nhưng nếu bạn không '# undef' chúng, kết quả có thể tồi tệ hơn. –

+0

@ R.MartinhoFernandes Tôi đang cố gắng hạn chế * hack/macro * của tôi thành khu vực nhỏ nhất có thể :) – JaredPar

+0

Tôi nghĩ nếu bạn định nạp quá nhiều 'm_x' như thế, bạn đang muốn bị cắn trong mọi trường hợp. –

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