Tôi đã viết một hàm tải byte ra khỏi tệp và trả về cấu trúc FileData chứa bộ đệm byte và độ dài của bộ đệm.Sử dụng con trỏ thông minh trong cấu trúc hoặc lớp
Tôi muốn bộ đệm bị xóa ngay sau khi được tiêu thụ và bị loại bỏ khỏi phạm vi.
Tôi đang gặp sự cố khi biên dịch do các lỗi truyền khác nhau. Ngoài ra, tôi không chắc liệu bộ đệm đang được di chuyển đúng chứ không phải sao chép. Tôi không nhớ FileData struct được sao chép, vì nó có thể là 16 byte nhiều nhất.
Nói chung, làm cách nào để bạn sử dụng con trỏ thông minh làm trường lớp/cấu trúc? Đó có phải là thứ bạn muốn làm không?
Đây là một câu hỏi nhỏ, tôi biết, nhưng vì tôi đang gặp một số khó khăn về khái niệm với con trỏ thông minh nói chung, tôi hy vọng rằng ví dụ này sẽ giúp tôi đi đúng hướng.
Đây là những gì tôi đã có cho đến nay:
struct FileData
{
unique_ptr<char[]> buf;
unsigned int len;
};
FileData LoadFile(string filename)
{
ifstream str;
str.open(filename, ios::binary);
str.seekg(0, ios::end);
auto len = str.tellg();
str.seekg(0, ios::beg);
char* buf = new char[len];
str.read(buf, len);
str.close();
FileData d = { unique_ptr<char[]>(buf), len };
return d;
}
Edit: Kể từ khi một số người đang tò mò về thông báo lỗi mà tôi nhận được với mã hiện này, ở đây nó là:
error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
Vấn đề của bạn là bạn không cung cấp bất kỳ chi tiết cụ thể nào về các thông báo lỗi. Làm thế nào trên trái đất chúng ta có thể có thể xác định chúng khác? – Puppy
@DeadMG Tôi cho rằng rõ ràng là có vấn đề với mã, vì tôi đã chỉ ra rằng tôi không chắc đây là cách chính xác để sử dụng con trỏ thông minh và di chuyển ngữ nghĩa. Tôi muốn mã làm nhiều hơn biên dịch; Tôi muốn nó chính xác và thành ngữ. Tuy nhiên, tôi đã cập nhật câu hỏi với thông báo lỗi. –
Lỗi bạn đang nhận được là vì bạn đang cố gắng sao chép một unique_ptr, bạn phải sử dụng std :: move. Bạn có thể đã sử dụng shared_ptr và khai báo deallocator của riêng bạn, nhưng giải pháp vector là sạch hơn nhiều. – pstrjds