Tôi muốn lặp qua mảng nổi được phân bổ trước với vùng chứa tùy chỉnh không sở hữu dữ liệu nhưng hoạt động trên phân đoạn của nó. Ví dụ, đặt tên cho các lớp container LinhaSobre
:Quy tắc trả về tham chiếu đối tượng giả trong C++
std::unique_ptr<float[]> data(new float[720]);
...
//creates container to iterate 26 floats starting from from data[12]
LinhaSobre cont(data.get()+12, 26);
//sets those elements to 1.5
for(size_t i = 0; i < cont.size(); i++)
cont[i] = 1.5f;
Dưới đây là một thực thể của operator[]
:
//...
//LinhaSobre has a member mem0 which is initialized
//as a pointer to where the interval starts
float & LinhaSobre::operator[] (size_t i)
{
return *(mem0+i);
}
Chú ý rằng tôi đang trở về một tham chiếu từ LinhaSobre::operator[]
để dữ liệu mà nó không sở hữu. Nó không nên can thiệp vào tuổi thọ của dữ liệu (các nhà xây dựng, các destructor).
Bây giờ tôi muốn hiển thị data
được lưu trữ bởi một mẫu khác, std::array<float,4>
và không tinh khiết float
. Ví dụ, đặt tên cho lớp mới LinhaSobre4f
:
std::unique_ptr<float[]> data(new float[720]);
...
//creates container to iterate 4 array<float, 4> starting from from data[12]
LinhaSobre4f l(data.get()+(3*4), 4);
//sets those elements to {1.5f, 2.5f, 3.5f, 4.5f};
for(size_t i = 0; i < l.size(); i++)
l[i] = { {1.5f, 2.5f, 3.5f, 4.5f} };
Lưu ý rằng tôi coi các mục là mảng. Điều này sẽ dẫn đến một số thay đổi trong lớp container, mối quan tâm chính của tôi là với operator[]
, đây là mã lớp đầy đủ:
struct LinhaSobre4f
{
LinhaSobre4f(float * pos_begin, size_t size_):
pos0(pos_begin),
size_(size_){}
std::array<float, 4> & operator[](size_t i)const
{
std::array<float,4> * r =
reinterpret_cast<std::array<float,4>*> (pos0+(4*i));
return *r;
}
size_t size()const
{
return size_;
}
private:
float * pos0;
size_t size_;
};
Các operator[]
trả về một tham chiếu đến một khối bộ nhớ coi là một std::array<float,4>
mà không bao giờ thực sự tồn tại như vậy, nhưng với bảo hành bố trí bộ nhớ std::array
, nó hoạt động. Tôi không chắc về điều này, có ổn không? (ngoài việc liên kết bộ nhớ, mà tôi sẽ đảm bảo). Tôi có được phép phơi bày một vật như thế này, theo ngữ nghĩa không? Thuật ngữ chính xác cho điều này là gì? (Tôi đã sử dụng đối tượng giả mạo trong tiêu đề).
Here's a live demo of the example. Here's another (the other link sometimes fails)
Một điều chắc chắn nổi bật với tôi (và trình biên dịch sẽ cảnh báo bạn về điều này) là trong 'toán tử []' của 'LinhaSobre4f' bạn đang trả về tham chiếu đến biến tạm thời - bạn nên thay đổi chữ ký để trả về theo giá trị thay vì tham chiếu. – ArchbishopOfBanterbury
(Tôi có?) Biến cục bộ (tạm thời) là một con trỏ, và tôi trả lại tham số của nó, không phải là tham chiếu đến nó. – Kahler
Tôi nghĩ * bạn an toàn, mặc dù tôi không có gì để sao lưu nó. – vu1p3n0x