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

question-closed Wektory a funkcja resize()

Object Storage Arubacloud
0 głosów
239 wizyt
pytanie zadane 18 kwietnia 2018 w C i C++ przez Perseusz Bywalec (2,190 p.)
zamknięte 19 kwietnia 2018 przez Perseusz

Hej, zacząłem się trochę uczyć wektorów i chciałem je zaimplementować do mojego "menu", no i natknąłem się na problem, bo w podanej niżej funkcji nie mogę użyć metody resize() dla wektora.

Nie zbyt się orientuje, a to że program mi mówi, że błąd jest w pliku stl_construct.h nie pomaga.

for (unsigned N = 0; N < panels.size(); N++) {
    window.draw(panels.at(N).desk);
    window.draw(panels.at(N).title);
    for (unsigned i = 0; i < panels.at(N).buttons.size(); i++){
        if (b_isClicked(panels.at(N).buttons.at(i).body, events) == true){
                    
             b_ISCLICKED(i, N);
             //wykonuje polecenie wciśniętego przycisku

        }//sprawdza czy przycisk został wciśnięty
        else {
            window.draw(panels.at(N).buttons.at(i).body);
            window.draw(panels.at(N).buttons.at(i).text);
        }//rysuje zawartość przycisków
    }
}
void MenuModule::b_ISCLICKED(unsigned i, unsigned N)
{
    switch (panels.at(N).pType)
    {
    case menu_typ:{
        if (i == 4){
            PanelType type = exit_pup;
            Panel panel(*settings, type);
            panels.push_back(panel);
        }
        else {
            if (panels.size() > 1)
                panels.resize(1);  ///!!!
            panels.resize(2);      ///!!!
            PanelType type = (PanelType)(i+1);
            Panel panel(*settings, type);
            panels.push_back(panel);
        }
        break;}
    ... ...

Wdzięczny będe bardzo za pomoccheeky

Z tego co sam rozumiem to główna pętla będzie się wykonywać dopóki jest mniejsza niż rozmiar wektora, a że pobiera go za każdym razem to nie powinno być chyba błędu logicznego. W wewnętrznej pętli próbowałem zmieniać wartość z panels(N) na jakąś inną zmienną ale nic to nie daje

Jakoś więcej pomysłów nie mam...

komentarz zamknięcia: Otrzymałem odpowiedź | Brak konstruktora domyślnego lub inaczej argumentów w resize() |
komentarz 18 kwietnia 2018 przez adrian17 Ekspert (344,860 p.)
Jakiego typu jest `panels`? `vector<Panel>`?

Czy `Panel` ma konstruktor domyślny?

(btw, możesz używać indeksowania [5] w vectorach, tak jak w zwykłych tablicach)
komentarz 19 kwietnia 2018 przez Perseusz Bywalec (2,190 p.)
std::vector <Panel> panels;

No konstruktora domyślnego nie ma, ale się obszedłem

No i dzięki za info, z tym indeksowaniem to nie miałem pojęciablush

2 odpowiedzi

+1 głos
odpowiedź 19 kwietnia 2018 przez Łukasz Wasilewski Mądrala (5,190 p.)
wybrane 19 kwietnia 2018 przez Perseusz
 
Najlepsza

Problem polega na tym, że funkcja resize() odnosi się do obecnego rozmiaru wektora i jeśli liczba jest większa niż ilość elementów to dodaje do jego końca obiekty danego typu tworzone konstruktorem domyślnym

Z tego co widzę, obiekt panel tworzysz za pomocą konstruktora z 2 parametrami. 

Gdy używasz funkcji push_back() nie musisz używać resize, ponieważ metoda ta sama w sobie zwiększa rozmiar kontenera o 1.

Jeśli natomiast chcesz użyć funkcji resize() , a nie masz konstruktora domyślnego dla klasy Panel, jako drugi argument tej funkcji podajesz wartość domyślną - czyli konstruktor którym stworzy nowo dodany obiekt. W twoim przykładzie było by to:

panels.resize(2, Panel(*settings, type));

 

Mam nadzieję, że pomogłem. :)

1
komentarz 19 kwietnia 2018 przez Perseusz Bywalec (2,190 p.)

Jak najbardziej pomogłeś! W ogóle nie myślałem, że będzie trzeba używać jakiś konstruktorów. Założyłem, że przecież pomniejszam to nic tworzyć nie muszę...

Użyłem kodu, który podałeś, wywaliłem tego ifa i wszystko tam działa! Dzięki wielkie!wink

0 głosów
odpowiedź 19 kwietnia 2018 przez mokrowski Mędrzec (155,460 p.)
Aby typ w std::vector poddał się operacji resize() na tym wektorze, powinien posiadać konstruktor domyślny i poddawać się operacji move(). Ten drugi warunek może być spełniony przez konstruktor kopiujący jeśli klasa nie jest trywialna. Po prostu w trakcie zwiększania wektora, uruchamiane są konstruktory domyślne elementu wewnątrz a jeśli dochodzi do realokacji pamięci, konstruktor-move lub konstruktor-copy (w tej kolejności). Jeśli nie możesz zrobić konstruktora domyślnego w danym przechowywanym typie, możesz posłużyć się inteligentnymi wskaźnikami trzymanymi w kontenerze lub std::reference_wrapper lub ... w ostateczności .. bo "kupujesz wiele problemów" wskaźnikami na elementy.
komentarz 19 kwietnia 2018 przez Perseusz Bywalec (2,190 p.)
No tworzenie domyślnego konstruktora trochę mi nie na rękę, ale jak kolega wyżej podał, konstruktora mogę użyć podczas resize(), co w sumie działa.

Podobne pytania

+1 głos
2 odpowiedzi 97 wizyt
pytanie zadane 23 sierpnia 2023 w C i C++ przez Janchess Początkujący (480 p.)
0 głosów
1 odpowiedź 479 wizyt
pytanie zadane 28 kwietnia 2020 w C i C++ przez Adrian Maj Nowicjusz (160 p.)
0 głosów
0 odpowiedzi 587 wizyt
pytanie zadane 12 kwietnia 2017 w C i C++ przez ChiriChiri Obywatel (1,260 p.)

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

61,920 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...