Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zwracanie unique_ptr

Ostatnio zmodyfikowano 2018-01-04 20:27
Autor Wiadomość
xvel
Temat założony przez niniejszego użytkownika
Zwracanie unique_ptr
» 2018-01-04 04:10:42
Mam vector unique_ptrów a sam vector jest polem klasy, chcę mieć dostęp do vectora poprzez przeciążony operator () ale zwrócić unique_ptr jeśli dobrze rozumiem mogę tylko przez std:move, a wtedy (jeśli dobrze rozumiem) zostanie on usunięty z vectora.
Czy jest jakieś inne rozwiąznie niż użycie po prostu shared_ptr albo zwykłego wskaźnika?

C/C++
class klasa
{
public:
   
    vector < unique_ptr < T >> wektor;
   
    unique_ptr < T > operator ()( int a )
    {
        return move( wektor.at( a ) );
    }
   
};
P-168395
darko202
» 2018-01-04 09:13:32
Nie zajmowałem się unique_ptr

ale czytając na :
https://msdn.microsoft.com​/pl-pl/library/hh279676.aspx
http://cpp0x.pl/kursy/Kurs-C++​/Poziom-5​/Wskazniki-inteligentne-C++11​/582
https://shaharmike.com/cpp​/unique-ptr/
oraz innych linkach znalezionych na 

https://www.google.pl/search​?ei=TtBNWqT1CYSbkwWRuo8I​&q=unique_ptr+c%2B%2B​&oq=unique_ptr+c%2B%2B​&gs_l=psy-ab.1.0.0j0i22i30k1l3j0i22i10i30k1l2j0i22i30k1l4.140191.141481.0.143320.3.3.0.0.0.0.103.295.2j1.3.0....0...1.1.64.psy-ab..0.3.292....0.6LHQ7Jrig-g

mylisz się chyba w rozumowaniu ?
>> zwrócić unique_ptr jeśli dobrze rozumiem mogę tylko przez std:move

gdyż funkcja move służy do Kopiuje określoną liczbę znaków z jednego ciągu do drugiego.
http://cpp0x.pl/dokumentacja​/standard-C++/char_traits/move​/285

i jako operacja którą przeprowadzamy na wskaźnikach nie jest to operacja bezpieczna.
* Tworzymy dwa wskaźniki
* oba wskazują na ten sam obszar pamięci
* zwalniamy jeden
* ten drugi nadal na coś wskazuje, ale jest to zwolniony obszar pamięci

z dokumentacji nie wynika aby move powodowało iż
>> zostaje on usunięty z vectora.
 

w pierwszym linku napisano jak robić to dla wektora
C/C++
void SongVector()
{
    vector < unique_ptr < Song >> songs;
   
    // Create a few new unique_ptr<Song> instances
    // and add them to vector using implicit move semantics.
    songs.push_back( make_unique < Song >( L"B'z", L"Juice" ) );
    songs.push_back( make_unique < Song >( L"Namie Amuro", L"Funky Town" ) );
    songs.push_back( make_unique < Song >( L"Kome Kome Club", L"Kimi ga Iru Dake de" ) );
    songs.push_back( make_unique < Song >( L"Ayumi Hamasaki", L"Poker Face" ) );
   
    // Pass by const reference when possible to avoid copying.
    for( const auto & song: songs )
    {
        wcout << L"Artist: " << song->artist << L"   Title: " << song->title << endl;
    }
}

P-168397
j23
» 2018-01-04 13:36:04
@xvel, jak Ci zwracanie wskaźnika nie pasuje, to zwracaj referencję.
P-168401
YooSy
» 2018-01-04 20:27:14
Można też pobrać wskaźnik metodą get udostępnioną przez klasę std::unique_ptr.
std::unique_ptr::get
P-168406
« 1 »
  Strona 1 z 1