Napisałem funkcję, która ładuje bajty z pliku i zwraca strukturę FileData, która zawiera bufor bajtowy i długość bufora.Używanie inteligentnych wskaźników w struct lub class
Chcę, aby bufor został usunięty, gdy tylko zostanie zużyty i wyrzucony poza zakres.
Mam problem z jego kompilacją z powodu różnych błędów rzutowania. Ponadto nie jestem pewien, czy bufor jest przenoszony poprawnie, a nie kopiowany. Nie mam nic przeciwko kopiowaniu samej struktury FileData, ponieważ może to być najwyżej 16 bajtów.
Ogólnie, jak używać inteligentnych wskaźników jako pól klasy/struktury? Czy to nawet coś, co zrobiłbyś?
To trochę mgliste pytanie, ale ponieważ mam pewne konceptualne trudności z inteligentnymi wskaźnikami, mam nadzieję, że ten przykład pomoże mi we właściwym kierunku.
Oto co mam do tej pory:
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: Ponieważ niektórzy ludzie są ciekawi komunikatu o błędzie, że otrzymuję z tego aktualnego kodu, to jest tutaj:
error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
Twój problem polega na tym, że nie podajesz żadnych szczegółowych informacji o błędach. Jak, na ziemi, możemy je zidentyfikować? – Puppy
@DeadMG Założę się, że jest oczywiste, że są problemy z kodem, ponieważ wskazałem, że nie jestem pewien, czy jest to właściwy sposób używania inteligentnych wskaźników i przenoszenia semantyki. Chciałbym, aby kod robił więcej niż kompilację; Chciałbym, żeby to było poprawne i idiomatyczne. Niemniej jednak zaktualizowałem to pytanie, wyświetlając komunikat o błędzie. –
Błąd, który otrzymujesz, ponieważ próbujesz skopiować unique_ptr, musisz użyć std :: move. Mogłeś użyć shared_ptr i zadeklarować swój własny deallocator, ale rozwiązanie wektorowe jest znacznie czystsze. – pstrjds