2013-04-25 31 views
6

Cách đơn giản nhất để hỏi câu hỏi này là với một số mã:đúc con trỏ đến mảng kích thước cố định trong câu lệnh return

struct Point 
{ 
    int x; 
    int y; 
    int z; 

    int* as_pointer() { return &x; }  // works 
    int (&as_array_ref())[3] { return &x; } // does not work 
}; 

as_pointer biên dịch, as_array_ref không. Một diễn viên có vẻ là theo thứ tự nhưng tôi không thể tìm ra cú pháp thích hợp. Bất kỳ ý tưởng?

+1

Vì vậy, bạn muốn trình biên dịch giả vờ rằng 'x' là, trên thực tế, một mảng của ba' int '? Không có gì đảm bảo rằng điều này sẽ hoạt động; các trình biên dịch có thể thêm phần đệm giữa các thành viên dữ liệu theo các cách khác với cách chúng đặt ra các mảng. –

Trả lời

7

tôi thấy rằng các loại mảng được dễ dàng hơn để đối phó với với một typedef:

typedef int ints[3]; 

Sau đó as_array_ref của bạn phải được viết sao cho &as_array_ref() == &x.

Các cú pháp sau đây có thể xảy ra:

  1. đồng bằng C-style cast từ int* để ints*:

    ints& as_array_ref() { return *((ints*)(&x)); }

  2. C++ phong cách reinterpret_cast (được đề xuất bởi @ Mike Seymour - xem thêm mình câu trả lời). Nó thường được coi là một thực hành tốt hơn trong C++:

    ints& as_array_ref() { return *reinterpret_cast<ints*>(&x); }

  3. Cast từ int& để ints& đó là hơi ngắn hơn nhưng (cho tôi) ít trực quan:

    ints& as_array_ref() { return reinterpret_cast<ints&>(x); }

+0

Hoạt động, cảm ơn! SO sẽ không cho phép tôi chấp nhận thêm 3 phút nữa ... –

+0

Rất vui, tôi rất vui được giúp đỡ;) – Antoine

+2

Tôi muốn xem một phong cách C++ 'reinterpret_cast' để làm cho nó rõ ràng hơn là một điều gì đó tinh ranh đang xảy ra. C-phong cách phôi cả nguy hiểm và khó khăn để tìm kiếm. –

2

tôi nghĩ rằng những gì bạn đang cố gắng làm sẽ dễ dàng hơn (và rõ ràng hơn/sạch hơn) với một công đoàn.

+0

Cũng là một gợi ý rất tốt, cảm ơn. Tôi thường tránh chúng vì vậy suy nghĩ thậm chí không vượt qua tâm trí tôi! –

+0

Tôi không chắc chắn về sạch hơn: trong cả hai trường hợp nếu struct-fields và mảng xảy ra để có padding/alignment khác nhau, nó sẽ không hoạt động. Vì vậy, trừ khi tôi nhầm lẫn cả hai giải pháp đều nguy hiểm. – Antoine

4

Dàn diễn viên bạn cần phải diễn giải lại một tham chiếu đến một biến như một tham chiếu đến một mảng là:

reinterpret_cast<int(&)[3]>(x); 

Hãy nhận biết rằng việc sử dụng này cung cấp cho hành vi undefined; nó có thể sẽ làm việc trên bất kỳ thực hiện hợp lý, nhưng không có đảm bảo rằng sẽ không có đệm giữa các thành viên của lớp, trong khi mảng không được đệm.

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