• 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

VPS Starter Arubacloud
0 głosów
361 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ź 132 wizyt
pytanie zadane 31 stycznia 2019 w C i C++ przez Milesq Nałogowiec (32,020 p.)
0 głosów
3 odpowiedzi 202 wizyt
pytanie zadane 29 lipca 2019 w C i C++ przez amelia.cpp Obywatel (1,860 p.)
0 głosów
1 odpowiedź 248 wizyt
pytanie zadane 7 czerwca 2019 w C i C++ przez BartekSV123 Nowicjusz (240 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...