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

Skopiowanie wektora dynamicznie tworzonych obiektów wskaźnikiem do klasy wirtualnej

Ostatnio zmodyfikowano 2019-01-26 13:25
Autor Wiadomość
ziombelas
Temat założony przez niniejszego użytkownika
Skopiowanie wektora dynamicznie tworzonych obiektów wskaźnikiem do klasy wirtualnej
» 2019-01-26 10:45:01
Mam klasę abstrakcyjną Figure, przechowuje jej obiekty w pojemniku:
std::vector<Figure*> figures;
Obiekty są tworzone dynamicznie jak np.
figures.push_back(new Rook(currentColor, &chessboard.field[y][x], &chessboard));

Teraz chciałbym utworzyć kopię obiekt po obiekcie otrzymując wektor wskaźników do kopii tych obiektów (nie jako wskaźniki wskazujące na ten sam obiekt). Czy ktoś widzi taką możliwość?
P-173684
pekfos
» 2019-01-26 11:45:48
Obiekty muszą wiedzieć, jak się skopiować.
C/C++
#include <iostream>
#include <vector>

class Figura
{
public:
    virtual Figura * clone() = 0;
    virtual void info() = 0;
};

class Kwadrat
    : public Figura
{
    float a;
public:
    Kwadrat( float a )
        : a( a )
    { }
    Figura * clone() override
    {
        return new Kwadrat( a );
    }
    void info() override
    {
        std::cout << "Kwadrat (" <<( void * ) this << ") " << a << " x " << a << '\n';
    }
};

class Prostokat
    : public Figura
{
    float a, b;
public:
    Prostokat( float a, float b )
        : a( a )
         , b( b )
    { }
    Figura * clone() override
    {
        return new Prostokat( a, b );
    }
    void info() override
    {
        std::cout << "Prostokat (" <<( void * ) this << ")" << a << " x " << b << '\n';
    }
};

int main()
{
    std::vector < Figura *> v;
    v.push_back( new Kwadrat( 5 ) );
    v.push_back( new Prostokat( 3, 10 ) );
   
    for( auto * p: v )
         p->info();
   
    std::vector < Figura *> kopia;
    kopia.reserve( v.size() );
   
    for( auto * p: v )
         kopia.push_back( p->clone() );
   
    for( auto * p: kopia )
         p->info();
   
}
Kwadrat (0xd324d0) 5 x 5
Prostokat (0xd32510)3 x 10
Kwadrat (0xb72800) 5 x 5
Prostokat (0xb72820)3 x 10
P-173686
ziombelas
Temat założony przez niniejszego użytkownika
» 2019-01-26 13:01:36
Dziękuję, o to to :). Widzę, że nowe standardy rozwiązały szybko sprawę a mi pozostaje się ich douczyć :)

Język znam naprawdę dobrze, lecz niestety ten z poprzedniej dekady czyli zatrzymałem się na szablonach i tego typu sprawach. Kodować potrafię. Proszę Cię jako eksperta o sugestie skąd warto się douczyć nowych wersji c++? Polecasz może książkę "Skuteczny nowoczesny C++. 42 sposoby lepszego posługiwania się językami C++11 I C++14", autor Meyers Scott?
P-173687
pekfos
» 2019-01-26 13:25:19
Nie czytałem książki o C++ od 5 lat, ale od Scotta Meyersa pewnie będzie dobra.
P-173688
« 1 »
  Strona 1 z 1