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

Dodanie klasy do wektora

Aruba Cloud - Virtual Private Server VPS
0 głosów
164 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,200 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ź 218 wizyt
pytanie zadane 22 marca 2019 w C i C++ przez poldeeek Mądrala (5,980 p.)
0 głosów
1 odpowiedź 240 wizyt
pytanie zadane 20 września 2021 w C i C++ przez tonn204 Mądrala (7,470 p.)
0 głosów
1 odpowiedź 877 wizyt
pytanie zadane 16 listopada 2020 w C i C++ przez Lyokoheros Początkujący (340 p.)

93,329 zapytań

142,323 odpowiedzi

322,400 komentarzy

62,664 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...