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

Dostęp do metody w std::map

42 Warsaw Coding Academy
0 głosów
444 wizyt
pytanie zadane 25 czerwca 2017 w C i C++ przez Alvancaran Dyskutant (8,160 p.)

Przykład:

class Button
{
public:
    void Draw();
};

std::map<std::string, Button *> buttons;

Jak mogę uzyskać dostęp do metody Draw() iterując przez wszystkie obiekty znajdującie się w buttons w pętli?

Póki co mam coś takiego:

for(auto it = buttons.begin(); it != buttons.end(); ++it)
 {
        
 }

tylko teraz nie wiem jak mogę użyć metody Draw() na każdym obiekcie klasy Button znajdującym się w tym kontenerze.

 

1 odpowiedź

+1 głos
odpowiedź 25 czerwca 2017 przez Knayder Nałogowiec (37,640 p.)
wybrane 25 czerwca 2017 przez Alvancaran
 
Najlepsza
it->first; //std::string
it->second; //Button*

http://www.cplusplus.com/reference/map/map/begin/

komentarz 25 czerwca 2017 przez Alvancaran Dyskutant (8,160 p.)

Próbowałem już i przy takim czymś:

it->second->Draw();

wywala mi aplikację, a nie wiem jak inaczej mam uzyskać dostęp do tej metody.

komentarz 25 czerwca 2017 przez Knayder Nałogowiec (37,640 p.)
A jak dodajesz elementy do tej mapy?
Jesteś pewny że tworzysz obiekty na wskaźniku, czy wysyłasz pusty do mapy?
komentarz 25 czerwca 2017 przez Alvancaran Dyskutant (8,160 p.)
edycja 25 czerwca 2017 przez Alvancaran

Button * newButton = new Button(position, text); 
buttons[text] = newButton; 
delete newButton;

Ale czy tak powinienem mieć dostęp do metody czy inaczej?

it->second->Draw()

 

komentarz 25 czerwca 2017 przez Knayder Nałogowiec (37,640 p.)

Dlaczego deletujesz newButton zaraz po "wsadzeniu" go do mapy?
Powinieneś iterować i deletować wszystkie elementy w mapie, jak już nie będziesz ich potrzebował.
Przykładowy kod:
 

#include <iostream>
#include <map>

int main() {
	std::map<std::string, int*> map;

	int *a = new int(5);
	map["jeden"] = a;
	std::cout << *(map["jeden"]);

	for (auto it : map)
		delete (it.second);
	system("pause");
	return 0;
}

 

komentarz 25 czerwca 2017 przez Alvancaran Dyskutant (8,160 p.)

Dzięki wielkie :D

Mam jeszcze jedno pytanko. Ten kontener mam w klasie Menu, w której mam też oddzielną metodę, która dodaje przycisk.Teraz wygląda ona tak:

void Menu::AddButton(Vector2f position, string text)
{
    Button * newButton = new Button(position, text);
    buttons[text] = newButton;
}

I w destruktorze tej klasy mam teraz taki kod:

for(auto it : buttons)
    {
        delete it.second;
    }

Czy jest to potrzebne czy destruktor sam to usunie? I czy ten wskaźnik w funkcji AddButton sam się nie usuwa gdy kończy się funkcja?

komentarz 25 czerwca 2017 przez Knayder Nałogowiec (37,640 p.)
W destruktorze musi być zawarta ta pętla.
Wskaźnik jest usuwany gdy wyjdzie się poza pole jego zasięgu (Klamry), jednak dynamicznie zaalokowany obiekt nadal znajduje się w pamięci. Trzeba go wtedy usunąć operatorem delete.
komentarz 25 czerwca 2017 przez Alvancaran Dyskutant (8,160 p.)
Ok, dzięki

Podobne pytania

0 głosów
1 odpowiedź 211 wizyt
pytanie zadane 31 stycznia 2019 w C i C++ przez Milesq Nałogowiec (32,020 p.)
0 głosów
3 odpowiedzi 278 wizyt
pytanie zadane 29 lipca 2019 w C i C++ przez amelia.cpp Obywatel (1,860 p.)
0 głosów
1 odpowiedź 349 wizyt
pytanie zadane 7 czerwca 2019 w C i C++ przez BartekSV123 Nowicjusz (240 p.)

93,394 zapytań

142,388 odpowiedzi

322,553 komentarzy

62,753 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
...