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

Dodanie klasy do wektora

42 Warsaw Coding Academy
0 głosów
167 wizyt
pytanie zadane 5 kwietnia 2019 w C i C++ przez poldeeek Mądrala (5,980 p.)

Witam, chciałem napisać program zapamiętujący Wielkąty które rysuje w klasie Wielokąt poprzez trzymanie ich krawędzi w vectorze krawedzie z elementami typu klasa Krawedz... Kod wygląda tak: 
 

class Krawedz{
public:
    int x1, x2;
    int y1, y2;

    Krawedz(int a1, int a2, int b1, int b2){
        x1 = a1;
        x2 = a2;
        y1 = b1;
        y2 = b2;
    }
};

class Wielokat{
public:
    QVector <Krawedz> krawedzie;

    void dodaj(QVector <Krawedz> x){
        for(int i = 0; i < x.size(); i++)
            krawedzie.push_back(x[i]);
    }

    void usun(){
        krawedzie.pop_back();
    }
};


    QVector <Krawedz> krawedzie;

    QVector <Wielokat> tab1;

Dodawanie krawędzi wygląda następująco, są oczywiście przypadki rozpatrzone kiedy wierzochołek jest pierwszy, kiedy ostatni itd, ale ogólnie dodanie każdej krawędzi do wielokąta wygląda tak:

 Krawedz nowa(krawedzie[krawedzie.size()-1].x2, krawedzie[krawedzie.size()-1].y2, x, y);
                        rysujOdc(krawedzie[krawedzie.size()-1].x2, krawedzie[krawedzie.size()-1].y2, x, y);

No i po skończeniu rysowania wielokąta jest jeszcze takie wywołanie:
 

tab1[licznik_w].dodaj(krawedzie);

I problem pojawia się przy kompilacji programu 3 razy (bo tyle jest przypadków dodania krawedzi z tymi wierzchołkami w funkcji).
 

D:\Qt\5.12.0\mingw73_64\include\QtCore\qvector.h:607: błąd: no matching function for call to 'Krawedz::Krawedz()'
                                 new (dst++) T();
                                 ^~~~~~~~~~~~~~~

I szczerze mówiąc nie wiem o co może chodzić....

1 odpowiedź

+1 głos
odpowiedź 6 kwietnia 2019 przez mokrowski Mędrzec (158,440 p.)

Problem polega na tym że definiując nietrywialny (bo wymagający argumentów) konstruktor dla klasy Krawedz, łamiesz zobowiązanie obiektów wymagane przez QVector. Ten kontener wymaga obiektów które będą mogły inicjalizować się konstruktorem bezargumentowym. Dzieje się tak w momencie gdy następuje realokacja pamięci w QVector po dodaniu nowego elementu który wymaga powiększenia pamięci na nowe elementy.

Rozwiązanie najprostsze to dodanie konstruktora bez argumentów który np. ustawi atrybuty na 0. Ale podaję to rozwiązanie jako bezpośrednią odpowiedź na problem intuicyjnie czując że zaraz zabrniesz w następny problem :-/

Przeczytaj to: https://en.cppreference.com/w/cpp/language/rule_of_three

Podobne pytania

0 głosów
1 odpowiedź 221 wizyt
pytanie zadane 22 marca 2019 w C i C++ przez poldeeek Mądrala (5,980 p.)
0 głosów
1 odpowiedź 256 wizyt
pytanie zadane 20 września 2021 w C i C++ przez tonn204 Mądrala (7,470 p.)
0 głosów
1 odpowiedź 917 wizyt
pytanie zadane 16 listopada 2020 w C i C++ przez Lyokoheros Początkujący (340 p.)

93,394 zapytań

142,387 odpowiedzi

322,550 komentarzy

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