• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wektory przechowujące wskaźniki

42 Warsaw Coding Academy
0 głosów
516 wizyt
pytanie zadane 16 października 2016 w C i C++ przez timrh Mądrala (6,010 p.)

Witam, chcę pokazać mój problem na przykładzie, załóżmy że są 2 klasy

class Istota
class Czlowiek : public Istota;

I że w klasie bazowej czyli Istocie jest metoda która np. wyłącza widoczność modelu na mapie:

class Istota
{
bool enabled;

public:

void SetActive(bool enable)
{
enabled = enable;
}

bool IsActive()
{
return enabled;
}
}

I jeżeli teraz zrobię obiekt klasy Człowiek i zrobię wektor dla Istot oraz dla Ludzi i wyślę tam wskaźnik do właśnie utworzonego obiektu

std::vector<Istota> istoty;
std::vector<Czlowiek> ludzie;

Czlowiek()
{
istoty.push_back(*this);
ludzie.push_back(*this);
}

I teraz jeżeli jest pętla sprawdzająca aktywność danej istoty:

for(int i=0; i<istoty.size(); i++)
if(istoty[i].IsActive()) Rysuj();

i np ustawie w wektorze z ludźmi dla tego samego obiektu że jest nieaktywny to w wektorze z istotami on wciąż będzie aktywny, tak jakbym modyfikował tylko kopię danego obiektu a nie oryginał. Próbowałem robić tak:

std::vector<Istota&> istoty
std::vector<Czlowiek&> czlowiek

Ale wtedy wywala mi masę błędów typu 'pointer:" pointer to reference is illegal itp.

Pomocy!

3 odpowiedzi

0 głosów
odpowiedź 16 października 2016 przez Avernis Nałogowiec (27,400 p.)
Użyj wskaźników, a nie referencji
0 głosów
odpowiedź 16 października 2016 przez JAKUBW Nałogowiec (33,470 p.)
std::vector<Istota*> istoty;

std::vector<Czlowiek*> ludzie;

 

0 głosów
odpowiedź 16 października 2016 przez criss Mędrzec (172,590 p.)

i np ustawie w wektorze z ludźmi dla tego samego obiektu że jest nieaktywny to w wektorze z istotami on wciąż będzie aktywny, tak jakbym modyfikował tylko kopię danego obiektu a nie oryginał.

Tak, bo push_back kopiuje przekazany obiekt (więc każdy z vectorów przetrzymuje inny obiekt - kopie *this). A chcesz, żeby każdy vector trzymał ten sam obiekt. Jeśli vectory będą przetrzymywać obiekty, to nie jest to możliwe. Ale tak jak podpowiadaja niżej : przetrzymuj wskaźniki na obiekty. Oczywiście wskaźniki powinny wskazywać na obiekty zaalokowane dynamicznie, więc skorzystaj z std::shared_ptr. Ew. możesz przetrzymywać "referencje" korzystając z std::reference_wrapper, ale rozwiązanie ze wskaźnikami jest praktyczniejsze chociażby ze względu na zwalnianie pamięci. reference_wrapper służy raczej do czego innego.

Podobne pytania

0 głosów
1 odpowiedź 756 wizyt
pytanie zadane 6 sierpnia 2020 w C i C++ przez Feszyn F Flora Początkujący (320 p.)
0 głosów
1 odpowiedź 443 wizyt
pytanie zadane 6 lipca 2016 w C i C++ przez rattle Użytkownik (510 p.)

93,383 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,744 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...