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

Dodanie klasy do wektora

Object Storage Arubacloud
0 głosów
138 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 (156,220 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ź 179 wizyt
pytanie zadane 22 marca 2019 w C i C++ przez poldeeek Mądrala (5,980 p.)
0 głosów
1 odpowiedź 176 wizyt
pytanie zadane 20 września 2021 w C i C++ przez tonn204 Mądrala (7,440 p.)
0 głosów
1 odpowiedź 612 wizyt
pytanie zadane 16 listopada 2020 w C i C++ przez Lyokoheros Początkujący (340 p.)

92,674 zapytań

141,575 odpowiedzi

320,045 komentarzy

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

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!

...