• 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
135 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 (155,460 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ź 172 wizyt
pytanie zadane 22 marca 2019 w C i C++ przez poldeeek Mądrala (5,980 p.)
0 głosów
1 odpowiedź 171 wizyt
pytanie zadane 20 września 2021 w C i C++ przez tonn204 Mądrala (7,440 p.)
0 głosów
1 odpowiedź 562 wizyt
pytanie zadane 16 listopada 2020 w C i C++ przez Lyokoheros Początkujący (340 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...