Lista shared_ptr
Ostatnio zmodyfikowano 2018-06-12 23:23
Wolfff Temat założony przez niniejszego użytkownika |
Lista shared_ptr » 2018-06-12 18:09:16 Witam, męczę się z programem który chcę napisać z użyciem listy zawierającej wskaźniki dzielone. Nie do końca rozumiem implementację shared_ptr oraz list, a z przeglądania materiałów na YouTube, forach czy stronach (oraz mojej trochę za starej książki) nie przyniosły rezultatu. Bardzo dziękuję za wszelką pomoc. Program ma za zadanie wyświetlenie 5 razy "Zel" oraz 5 razy "Grafit" przez funkcję Wypisz (lub coś podobnego, ogólny zarys jest w moim pomieszanym kodzie). Nie jest to program który ma mieć jakiś sens i wiem że można ten wynik osiągnąć dużo łatwiej, jednak próbuję zrozumieć wskaźniki i listy przez to przykładowe zadanie. #include <iostream> #include <list> #include <memory> class Pisadlo { public: virtual void Wklad(); }; class Dlugopis : public Pisadlo { public: void Wklad() { std::cout << "Zel" << std::endl; } }; class Olowek : public Pisadlo { public: void Wklad() { std::cout << "Grafit" << std::endl; } }; class Biurko { std::list < std::shared_ptr < Pisadlo >> lis; public: void DodajElement( std::shared_ptr < Pisadlo > ) { lis.push_back( std::make_shared < Pisadlo >( 1 ) ); }; void Wypisz() { std::cout << "W biurku jest: " << std::endl; }; }; int main() { Biurko b; Dlugopis d; for( int i = 0; i < 5; i++ ) { b.DodajElement( std::shared_ptr < Dlugopis > ); } for( int i = 0; i < 5; i++ ) { b.DodajElement( std::shared_ptr < Olowek > ); } return 0; }
|
|
pekfos |
» 2018-06-12 19:42:02 void DodajElement( std::shared_ptr < Pisadlo > ) { lis.push_back( std::make_shared < Pisadlo >( 1 ) ); };
|
Może być ciężko dodać element przekazany przez argument, jeśli nawet nie nadasz argumentowi nazwy. |
|
Wolfff Temat założony przez niniejszego użytkownika |
» 2018-06-12 19:55:19 O, racja. Wyskakuje błąd expected primary expression before 'd', w b.DodajElement( std::shared_ptr < Dlugopis > d ); A poświęcił byś chwilę czasu na jakieś krótkie wyjaśnienie jak to powinno wyglądać? I jak zrobić żeby wyczytał ten Zel i Grafit po pięć razy? Dzięki |
|
pekfos |
» 2018-06-12 20:10:50 |
|
Wolfff Temat założony przez niniejszego użytkownika |
» 2018-06-12 20:22:12 Ehhh, poczekam aż odpisze ktoś kto nie pisze tylko po to żeby pisać. Nie wiem jak to ma wyglądać bo nie jestem zaznajomiony z formatem pomieszania listy i shared_ptr. Jeżeli odpowiedź jest krótka to chyba by było szybciej napisać jedno zdanie a nie strzelać komuś w kolano i odsyłać do pierwszej części kursu C++. Poza tym nie ma tam odpowiedzi na pytanie jak z listy wyłuskać funkcję klas które są do niej przekazane przez shared_ptr a to mój główny problem. |
|
YooSy |
» 2018-06-12 20:50:29 Do std::shared_ptr odwołujesz się dokładnie tak samo jak do gołego wskaźnika. #include <iostream> #include <memory> #include <string>
struct Foo { Foo( int n = 0 ) : number { n } { } void Print() const { std::cout << number << '\n'; } int number; };
void DoSomething( std::shared_ptr < Foo >& foo ) { foo->number *= 2; }
int main() { std::shared_ptr < Foo > foo = std::make_shared < Foo >( 42 ); foo->Print(); DoSomething( foo ); foo->Print(); }
|
|
Wolfff Temat założony przez niniejszego użytkownika |
» 2018-06-12 21:14:44 Kurde zgubiłeś mnie na tym zapisie Foo( int n = 0 ) : number { n } { }
Nie sądzę że wszystko jest źle w moim kodzie, mógłbyś wskazać na co zmienić kod w main? |
|
YooSy |
» 2018-06-12 21:22:35 Błąd formatowania na forum. Teraz będzie bez przesunięć. #include <iostream> #include <memory> #include <string>
struct Foo { Foo(int n = 0) : number{ n } {} void Print() const { std::cout << number << '\n'; } int number; };
void DoSomething(std::shared_ptr < Foo >& foo) { foo->number *= 2; }
int main() { std::shared_ptr < Foo > foo = std::make_shared < Foo >(42); foo->Print(); DoSomething(foo); foo->Print(); }
Kurde zgubiłeś mnie na tym zapisie |
Użycie (zalecane) listy inicjalizacyjnej konstruktora. Nie sądzę że wszystko jest źle w moim kodzie |
Nie ma definicji metody Wklad() klasy bazowej. Nie ma nazwanego argumentu metody DodajElement na co wskazał @pekfos. Nie używany obiekt d w funkcji głównej. Przykład kodu: #include <iostream> #include <memory> #include <list>
class SomethingToWrite { public: virtual void Refill() const = 0; virtual ~SomethingToWrite() { } };
class Pen : public SomethingToWrite { public: virtual void Refill() const override { std::cout << "Gel"; } };
class Pencil : public SomethingToWrite { public: virtual void Refill() const override { std::cout << "Graphite"; } };
class Desk { public: using ElemPtr = std::shared_ptr < SomethingToWrite >; using List = std::list < ElemPtr >; void Append( const ElemPtr & element ) { list.push_front( element ); } const List & GetList() const { return list; } private: List list; };
int main() { Desk desk; desk.Append( std::make_shared < Pen >() ); desk.Append( std::make_shared < Pencil >() ); for( auto const & el: desk.GetList() ) { el->Refill(); std::cout << '\n'; } }
|
|
« 1 » 2 |