Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: frank128 23. 10. 2021, 19:44:47
-
Ahojte, začal som sa venovať vývoju pre Unix a KDE. Chcel by som spraviť nejaké Qt GUI utilitky / aplikácie pre veci špecifické pre FreeBSD a Solaris. Lenže Qt si jazyk C++ troška ohýba, tak že sú tam mierne odlišnosti oproti bežnému C++. Celkový dojem z toho mám akoby som kódil v jazyku C# alebo Jave, ale zase daktoré veci mi prídu dosť archaické nepoužíva sa tam v takej miere preťažovanie operátorov, namiesto smart pointerov vidím vo vygenerovanom kóde z QtDesigneru natívne pointery a operátor new atď.
No a zarazila ma jedna vec:
Objekty podedené od QObject musím inštanciovať po starom (z ľava do prava):
QObject instance;
Ale keď to inštanciujem takto:
auto instance = QObject();
Tak mi to vyhodí takúto chybu:
http://pluton.cloud/attachment/8f4d3a81-5d3e-4403-bc3b-899b56f55579/issue.png (http://pluton.cloud/attachment/8f4d3a81-5d3e-4403-bc3b-899b56f55579/issue.png)
Prečo?
-
Když nefunguje (), tak zkus {} :)
Qt si nic neohýbá, jen generuje nějaké metadata navíc, to co píšeš je pořád C++ kompilované C++ compilerem.
-
Ahojte, začal som sa venovať vývoju pre Unix a KDE. Chcel by som spraviť nejaké Qt GUI utilitky / aplikácie pre veci špecifické pre FreeBSD a Solaris. Lenže Qt si jazyk C++ troška ohýba, tak že sú tam mierne odlišnosti oproti bežnému C++. Celkový dojem z toho mám akoby som kódil v jazyku C# alebo Jave, ale zase daktoré veci mi prídu dosť archaické nepoužíva sa tam v takej miere preťažovanie operátorov, namiesto smart pointerov vidím vo vygenerovanom kóde z QtDesigneru natívne pointery a operátor new atď.
No a zarazila ma jedna vec:
Objekty podedené od QObject musím inštanciovať po starom (z ľava do prava):
QObject instance;
Ale keď to inštanciujem takto:
auto instance = QObject();
Tak mi to vyhodí takúto chybu:
http://pluton.cloud/attachment/8f4d3a81-5d3e-4403-bc3b-899b56f55579/issue.png (http://pluton.cloud/attachment/8f4d3a81-5d3e-4403-bc3b-899b56f55579/issue.png)
Prečo?
Evidentně kompilátor bere auto instance = QObject();
jako copy initialization a chce použít copy constructor, který je ovšem v qobject.h na řádku 467 definovaný jako deleted. Naopak:
QObject instance;
je default initialization (https://en.cppreference.com/w/cpp/language/default_initialization), při které se copy constructor neuvažuje. Nicméně v C++17 už je to jinak a myslím, že tam už by se zkompilovala i první varianta.
-
Evidentně kompilátor bere auto instance = QObject();
jako copy initialization a chce použít copy constructor, který je ovšem v qobject.h na řádku 467 definovaný jako deleted. Naopak:
QObject instance;
je default initialization (https://en.cppreference.com/w/cpp/language/default_initialization), při které se copy constructor neuvažuje. Nicméně v C++17 už je to jinak a myslím, že tam už by se zkompilovala i první varianta.
Ďakujem Vám za informáciu.
Nastavil som si v *.pro súbore CONFIG += c++20
no skompilovať to stále nejde. Skúsim sa ešte pohrať s parametrami compilera a nastaveniami Qt Creatora. Prípadne vymením GCC za CLang.
Když nefunguje (), tak zkus {} :)
Qt si nic neohýbá, jen generuje nějaké metadata navíc, to co píšeš je pořád C++ kompilované C++ compilerem.
Myslel som to tak, že si ho ohýba na úrovni jazyka a preprocessora. Je to stále ten istý jazyk, akurát celkový dojem mám akoby to išlo mimo štandartnej koncepcie C++. Vyzerá to ako by sa Qt inšpirovalo tým najlepším zo sveta Javy a .NETu. No mne to vôbec nevadí, práve naopak, programuje sa v tom dobre - je to prívetivé a je to asi ten najlepší GUI framework, aký som kedy v C++ vyskúšal a rozhodne mi to k srdcu prirástlo viac také GTK či nebodaj MFC.