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

Dodanie klasy do wektora

0 głosów
217 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,960 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ź 293 wizyt
pytanie zadane 22 marca 2019 w C i C++ przez poldeeek Mądrala (5,980 p.)
0 głosów
1 odpowiedź 347 wizyt
pytanie zadane 20 września 2021 w C i C++ przez tonn204 Mądrala (7,470 p.)
0 głosów
1 odpowiedź 1,053 wizyt
pytanie zadane 16 listopada 2020 w C i C++ przez Lyokoheros Początkujący (340 p.)

93,695 zapytań

142,612 odpowiedzi

323,223 komentarzy

63,224 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...