Problem z przypisaniem lub porównaniem iteratora

0

Mam taki kod:

#include<iostream>
#include<conio.h>
#include<vector>


class Zwierzatko
{
public:
    Zwierzatko(){}
    virtual ~Zwierzatko(){std::cout<<"Zwierzatko destrukt.\n";}
    virtual void daj_glos()=0;
};

class Piesek:public Zwierzatko
{
public:
    Piesek(){}
    ~Piesek(){std::cout<<"Piesek destrukt.\n";}
    void daj_glos(){std::cout<<"hau, hau\n";}
};

class Kotek: public Zwierzatko
{
public:
    Kotek(){}
    ~Kotek(){std::cout<<"Kotek destrukt.\n";}
    void daj_glos(){std::cout<<"miau miau\n";}
};

int main()
{
    Zwierzatko *piesek = new Piesek();
    Zwierzatko *piesek2 = new Piesek();
    Zwierzatko *kotek = new Kotek();
    Zwierzatko *kotek2 = new Kotek();

    std::vector<Zwierzatko*> zwierzatka;
    zwierzatka.push_back(piesek);
    zwierzatka.push_back(piesek2);
    zwierzatka.push_back(kotek);
    zwierzatka.push_back(kotek2);

    for (Zwierzatko* i: zwierzatka)
        i->daj_glos();

    std::vector<Zwierzatko>::iterator it;
    for (it = zwierzatka.begin(); it != zwierzatka.end(); ++it)
        it->daj_glos();

    delete piesek;
    getchar();
}


W ostatniej pętli jest błąd: for (it = zwierzatka.begin(); it != zwierzatka.end(); ++it) kompilator wyrzuca mi błędy C2678 i C2679.
Jak zainicjować tą pętlę poprawnie?

2

Spróbuj tak dać głos:
(*it)->daj_glos();

No i iterator zrób:
std::vector<Zwierzatko*>::iterator it; - gwiazdka po Zwierzatko

2

A tak poza tym:

delete piesek;

a gdzie piesek2, kotek i kotek2?


```cpp void daj_glos(){std::cout<"hau, hau\n";} ``` Dobrym zwyczajem jest oznaczanie funkcji jako `virtual` również w klasach pochodnych, dla poprawienia czytelności. Oprócz tego warto używać `override`, żeby kompilator pomógł unikać głupich błędów. ```cpp virtual void daj_glos() override { std::cout<<"hau, hau\n"; } ```
0
szweszwe napisał(a):

Spróbuj tak dać głos:
(*it)->daj_glos();

No i iterator zrób:
std::vector<Zwierzatko*>::iterator it; - gwiazdka po Zwierzatko

Dzięki, o to chodziło, w końcu to wektor wskaźników, a nie obiektów.

0

Mam jeszcze jeden problem z iteratorem, jak dla takiej pętli:

std::vector<Zwierzatko*>::iterator it;
for (it=zwierzatka.begin(); it!-zwierzatka.end()-1; ++it)
{
    (*it)->daj_glos();
}

uzyskać dostęp do elementu it+1?
Próbowałem z (*it+1)->daj_glos(); i nawet się kompiluje, ale program zawiesza się po uruchomieniu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1