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

Lista shared_ptr

Ostatnio zmodyfikowano 2018-06-12 23:23
Autor Wiadomość
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.
C/C++
#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 > );
    }
    //funkcja Wypisz
    return 0;
}
P-171515
pekfos
» 2018-06-12 19:42:02
C/C++
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.
P-171516
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
P-171518
pekfos
» 2018-06-12 20:10:50
Będzie naprawdę krótkie - jeśli nie wiesz jak wywołać funkcję, znajdziesz to w kursie.
» Kurs C++ » Poziom 2Funkcje - pierwsze starcie lekcja
P-171519
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.
P-171521
YooSy
» 2018-06-12 20:50:29
Do std::shared_ptr odwołujesz się dokładnie tak samo jak do gołego wskaźnika.

C/C++
#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();
}
P-171522
Wolfff
Temat założony przez niniejszego użytkownika
» 2018-06-12 21:14:44
Kurde zgubiłeś mnie na tym zapisie
C/C++
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?
P-171523
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:
C/C++
#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';
    }
}
P-171524
« 1 » 2
  Strona 1 z 2 Następna strona