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

[C++] error: use of deleted function class::<unnamed union>::<constructor>()

Object Storage Arubacloud
0 głosów
711 wizyt
pytanie zadane 21 czerwca 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)

Witam.

Mam pewien problem którego rozwiązania nigdzie nie mogę znaleźć.

Tak wygląda moja klasa:

class Matcher{
    public:
        Matcher(std::string expr);
        ~Matcher();
        template<typename T> T GetConstant();
        const char* GetConstantValue();
    private:
        union{
            std::string str;
            char sing;
        }constant;
        UsedValue UsedVal; //wcześniej jest enum
        std::string ConstantValue;
        std::stack<std::map<std::string, std::string>> MatcherJuxtaposition;
};

kompilator wykrywa błąd w pliku Matcher.cpp:

#include "Matcher.h"


Matcher::Matcher(std::string expr){
    const char* regex="([A-Z]*|([A-Z]|[0-9])*)=(\".+\"|rand\((\s*[0-9]+\s*|(\s*[0-9]+\s*,\s*[0-9]+\s*))\))";
    if(!std::regex_match(expr, std::regex(regex){
        std::cout<<"\""<<expr<<"\" is incorrect.";
        delete regex;
        exit(1);
    }
    char CurrentChar;
    std::string constant;
    int iterator=0;
    do{
        CurrentChar=expression[iterator];
        expr.erase(0,1);
        constant+=CurrentChar;
    }while(CurrentChar!='=');
    if(constant.length()>1){
        this->constant.str=constant;
        this->UsedVal = STR;
    }
    else{
        this->constant.sing=constant.c_str();
        this->UsedVal = CHAR;
    }

    delete regex;
}

template<typename T> T Matcher::GetConstant(){
    if(this->UsedVal==STR) return this->constant.str;
    return this->constant.sing;
}

std::string Matcher::GetConstantValue(){return this->ConstantValue;}

matcher.cpp: In constructor 'Matcher::Matcher(std::__cxx11::string)':
matcher.cpp:4:34: error: use of deleted function 'Matcher::<unnamed union>::<con
structor>()'
 Matcher::Matcher(std::string expr){
                                  ^
compilation terminated due to -Wfatal-errors.

Nigdzie nie mogę znaleźć rozwiązania mojego problemu. Konstruktor jest normalny, więc nie rozumiem o co chodzi. 

 

Jeśli ktoś mógłby pomóc, byłbym bardzo wdzięczny.

 

Pozdrawiam, Hiskiel. 

komentarz 21 czerwca 2018 przez mokrowski Mędrzec (155,460 p.)

Rozdwojenie jaźni? Swipeyro <-> Hiskiel ?

komentarz 21 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)
Konto zakładałem jakiś rok temu, używałem losowego generatora nazw. Moim oficjalnym pseudonimem jest Hiskiel.
komentarz 21 czerwca 2018 przez criss Mędrzec (172,590 p.)
Chyba możesz napisać do kogoś z administracji z prośbą o zmiane nicku. Spróbuj
komentarz 21 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)
W sumie, nie pomyślałem o tym. Dzięki.

1 odpowiedź

+1 głos
odpowiedź 21 czerwca 2018 przez criss Mędrzec (172,590 p.)
wybrane 25 czerwca 2018 przez Hiskiel
 
Najlepsza
  • If a union contains a non-static data member with a non-trivial special member function (copy/moveconstructor, copy/move assignment, or destructor), that function is deleted by default in the union and needs to be defined explicitly by the programmer.
  • If a union contains a non-static data member with a non-trivial default constructor, the default constructor of the union is deleted by default unless a variant member of the union has a default member initializer .
  • At most one variant member can have a default member initializer.

https://en.cppreference.com/w/cpp/language/union 

Tzn. jeśli którykolwiek z memberów unii definiuje którąkolwiek z "non-trivial special member functions", to odpowiadające [tym non-trivial zdefiniowanym w którymś polu unii] special member functions są deleted w unii. A skoro unia nie ma teraz domyślnego konstruktora i jej obiekt jej memberem w Matcher, to Matcher też ma deleted default ctor (bo nie jest w stanie zawołać default ctor unii).

komentarz 21 czerwca 2018 przez criss Mędrzec (172,590 p.)
Poza tym.. skąd pomysł na taką unie? To raczej nie jest zbyt bezpieczne... Przede wszystkim nie wiesz jaki jest memory layout std::string...
komentarz 21 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)

non-trivial special member functions

Przetłumaczysz na chłopski? laugh

komentarz 21 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)
Skąd pomysł na tą unię?

Jeśli stała będzie jedną literką, to nie ma sensu zapisywać jej do stringa, więc idzie jako char, jeśli więcej niż jedna literka, to idzie jako string
komentarz 21 czerwca 2018 przez criss Mędrzec (172,590 p.)
Cóż... user-defined zawsze są traktowane jako non-trivial, a już samo "trivial" ma różne znaczenie zależnie czego dotyczy. Dla domyślnego konstruktora tzn. tyle, że nie robi nic, dla copy ctora oznacza tyle, że tylko przekopiowuje pamięć...

A co znaczy "special member functions" jest w nawiasie w cytacie, jeśli o to też pytałeś
komentarz 21 czerwca 2018 przez criss Mędrzec (172,590 p.)

Jeśli stała będzie jedną literką, to nie ma sensu zapisywać jej do stringa, więc idzie jako char, jeśli więcej niż jedna literka, to idzie jako string

Przekombinowane. I niebezpieczne. No i unia i tak będzie miała sizeof(std::string). Poza tym... co jeśli np. najpierw skorzystasz ze stringa a potem będzie tylko literka i zaczniesz korzystać z char-a? Modyfikacja wartości chara może ci zmodyfikować wewn. wskaźnik stringa jeśli akurat będziesz miał pecha z memory layoutem stringa. A wtedy destruktor stringa się wywali (przy próbie dealokacji już innego adresu)... Ogromne ryzyko dla zupełnie pomijalnego zysku :/

komentarz 21 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)
Czyli zrobiłem rzecz niebezpieczną, przez która mam problem i mogę mieć problemy, a jej poprawienie rozwiąże wszystkie te problemy, tak?
komentarz 21 czerwca 2018 przez criss Mędrzec (172,590 p.)
Wszystkie problemy rozwiąże pozbycie się tej unii, a compilation error rozwiąże zdefiniowanie default ctor dla unii :P
komentarz 21 czerwca 2018 przez mokrowski Mędrzec (155,460 p.)
Jak już koniecznie upierasz się przy rozwiązaniach z unią, to czy nie lepiej użyć czegoś bezpiecznego np. std::variant czy std::optional ? "Gołe struktury znane C" sprawiają zawsze większe lub mniejsze problemy (patrz tablice, enum, unia, wskaźniki... ).

Podobne pytania

0 głosów
1 odpowiedź 214 wizyt
pytanie zadane 4 maja 2018 w C i C++ przez Prime_Bull Obywatel (1,820 p.)
0 głosów
1 odpowiedź 136 wizyt
pytanie zadane 23 stycznia 2023 w C i C++ przez Marcinuq Użytkownik (640 p.)
0 głosów
4 odpowiedzi 1,564 wizyt
pytanie zadane 12 sierpnia 2016 w C i C++ przez niezalogowany

92,556 zapytań

141,404 odpowiedzi

319,562 komentarzy

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

...