Qt - potomkovia QObject a auto

Qt - potomkovia QObject a auto
« kdy: 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):

Kód: [Vybrat]
QObject instance;
Ale keď to inštanciujem takto:

Kód: [Vybrat]
auto instance = QObject();
Tak mi to vyhodí takúto chybu:

http://pluton.cloud/attachment/8f4d3a81-5d3e-4403-bc3b-899b56f55579/issue.png

Prečo?


Re:Qt - potomkovia QObject a auto
« Odpověď #1 kdy: 23. 10. 2021, 20:06:13 »
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.

Re:Qt - potomkovia QObject a auto
« Odpověď #2 kdy: 23. 10. 2021, 20:26:57 »
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):

Kód: [Vybrat]
QObject instance;
Ale keď to inštanciujem takto:

Kód: [Vybrat]
auto instance = QObject();
Tak mi to vyhodí takúto chybu:

http://pluton.cloud/attachment/8f4d3a81-5d3e-4403-bc3b-899b56f55579/issue.png

Prečo?

Evidentně kompilátor bere
Kód: [Vybrat]
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:

Kód: [Vybrat]
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.

Re:Qt - potomkovia QObject a auto
« Odpověď #3 kdy: 25. 10. 2021, 00:26:22 »
Evidentně kompilátor bere
Kód: [Vybrat]
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:

Kód: [Vybrat]
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
Kód: [Vybrat]
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.