QT-C ++ vs Generic C ++ dan STL [ditutup]

19

Telah menyikat C ++ saya akhir-akhir ini, di QQ Ubuntu. Saya suka kerangka Qt untuk semuanya, terutama membangun GUI. Saya menjadi cukup akrab dengannya ketika menggunakan PyQt selama beberapa tahun terakhir.

Ketika menggunakan PyQt, saya memiliki beberapa masalah yang sekarang lebih jelas ketika menggunakan C ++ dengan Qt: Qt memiliki banyak ekstensi untuk C ++ yang spesifik Qt - QString menjadi hanya satu contoh umum, belum lagi pengumpulan sampah otomatis. Dimungkinkan untuk menulis aplikasi Qt menggunakan C ++ tanpa mengetahui banyak tentang C ++ dan STL.

Saya mungkin harus segera memasuki pasar kerja lagi dan saya ingin dapat mempertimbangkan posisi C ++ - tapi saya takut mengikat diri saya terlalu banyak ke Qt akan membatasi kemampuan saya untuk bekerja dengan C ++ generik, yang dulunya cukup tangguh tetapi sekarang lama tidak aktif dan berkarat.

Haruskah saya menghindari Qt? Apakah saya akan lebih baik menggunakan WxWidgets atau GTK ++ untuk membangun GUI?

Apa kerangka kerja GUI terbaik untuk digunakan yang memungkinkan / membutuhkan sebagian besar penggunaan generik C ++ dan STL? Bagaimana cara membuat saya paling berharga sebagai programmer C ++ ketika datang ke kerangka kerja GUI, dll?

Vektor
sumber

Jawaban:

15

Saya tidak akan berhenti menggunakan Qt hanya karena alasan itu. Anda tidak diharuskan untuk menggunakan semua kelas utilitas Qt; untuk yang mengganti STL, paling banyak Anda akan dipaksa untuk menggunakan QString dan, mungkin, QStringList. Juga, biasanya ada lebih banyak program daripada GUI. Anda selalu dapat menggunakan C ++ generik secara eksklusif untuk program lainnya, dan menggunakan Qt hanya untuk GUI.

Menurut pendapat saya, bekerja dengan STL lebih tentang memahami struktur data apa yang digunakan dan kompleksitasnya, dan akibatnya pada saat mana Anda harus menggunakan setiap wadah. Dan ketika datang ke pemrograman C ++, ini terutama tentang mengetahui cara menggunakan header <algoritma> yang sangat esensial, yang juga harus bekerja pada kontainer Qt, karena mereka kompatibel dengan STL.

Saya tidak melihat banyak kerugian dalam menggunakan semua ekstensi yang disediakan Qt, selama Anda tahu (atau setidaknya memiliki gagasan umum) bagaimana mereka diterapkan secara internal. Pastikan Anda tahu bahwa hal-hal seperti Q_OBJECT, SIGNAL (), SLOT (), foreach (), bukan sihir, tetapi makro yang berkembang ke pernyataan C ++ yang valid. Misalnya, tidak terlalu rumit untuk memahami bagaimana kelas yang dibagikan secara implisit dan hubungan orangtua-anak yang membuat Qt merasa lebih seperti Java diimplementasikan. Anda selalu dapat mencoba untuk membuat kembali beberapa fungsionalitas dalam proyek terpisah hanya untuk melihat apakah Anda bisa melakukannya dengan C ++ generik, dan kemudian merasa tidak enak untuk menggunakannya di Qt.

Juga, lihatlah perpustakaan Boost. Mereka menyediakan utilitas tambahan yang tidak dimiliki pustaka C ++ standar, dan merupakan cara yang sangat baik untuk sedikit lebih dekat dengan C ++ generik, karena mereka pada dasarnya mengikuti konvensi yang sama seperti C ++ generik. Beberapa perpustakaan memiliki kelas templated yang cukup kompleks, dan hanya mencoba memahami bagaimana mereka bekerja, itu sendiri, merupakan studi yang baik dalam C ++. Boost memiliki banyak utilitas yang tidak dapat ditemukan di Qt, dan lainnya yang menerapkan konsep yang sama atau serupa dengan beberapa kelas Qt dan dapat digunakan sebagai gantinya.

Jika Anda memasuki pasar kerja yang bekerja dengan C ++, kemungkinan Anda akan bekerja dengan Qt atau kerangka kerja lain yang, serupa dengan itu, akan memiliki kelas utilitas sendiri yang mencoba membuat C ++ lebih sederhana.

LLLL
sumber
4
+1 untuk "Anda selalu dapat menggunakan C ++ generik secara eksklusif untuk program lainnya, dan menggunakan Qt hanya untuk GUI."
Md Mahbubur Rahman
@ MahbuburRAaman - ya - ini saran yang bagus. Gunakan Qt hanya untuk GUI dan apa yang diperlukan untuk menghubungkan kembali. Tulis sisanya menggunakan Generic C ++, STL, Boost - alat yang digunakan secara universal.
Vektor
5

Saya setuju dengan sebagian besar pujian tinggi dari Qt, tetapi pertanyaannya adalah Apa kerangka kerja GUI terbaik untuk digunakan yang memungkinkan / membutuhkan sebagian besar penggunaan C ++ generik dan STL? Dalam hal ini Qt sedikit skizofrenia: ia menduplikasi kontainer dan algoritma STL dengan tikungannya sendiri. Ini juga menyediakan wadah, yang berbeda dari STL. Interoperabilitas antara Qt dan STL tidak selalu mulus. Dalam beberapa kasus dibutuhkan beberapa fungsi panggilan untuk mendapatkan dari std::stringke QStringdan kembali.

wxWidgets memiliki opsi untuk membangun STL, yang menggunakan wadah STL secara eksklusif - tidak ada alam semesta paralel dengan penggantian yang ditanamkan di rumah seperti dalam kasus Qt. Itu juga mengkompilasi dengan kompiler C ++ standar tanpa memerlukan ekstensi non-standar. Ini adalah kerangka kerja GUI berkualitas yang patut dipertimbangkan.

Anda juga dapat melihat gtkmm, yang merupakan pembungkus C ++ di sekitar GTK +. Lebih dekat untuk memenuhi kebutuhan pertama Anda daripada Qt.

Paul Jurczak
sumber
1
'wxWidgets memiliki opsi untuk pembuatan STL, yang menggunakan wadah STL secara eksklusif ...' - Saya mengerti - ini PENTING untuk diketahui. 'Dalam beberapa kasus dibutuhkan beberapa pemanggilan fungsi untuk mendapatkan dari std :: string ke QString' - dipahami - saya belum menyelidiki hal itu. Saya agak terbiasa dengan GTK dan Wx - tetapi Qt tampaknya bersinar dibandingkan, setidaknya dari sudut pandang saya - C ++ BUKAN bahasa pertama saya - saya berasal dari dunia Clipper / Delphi dan kemudian belajar C ++ karena saya harus berurusan dengan Win 32 dll.
Vektor
2

Saya tidak akan terlalu khawatir tentang tidak menggunakan perpustakaan STL tertentu seperti std :: string atau std :: iostream atau std :: vector. Setara-QT datang dalam rasa yang berbeda tetapi mereka tidak begitu jauh untuk membuat masalah.

Perbedaan yang lebih idiomatis menurut saya tampaknya adalah gaya pemrograman yang berat digunakan newuntuk alokasi. Sementara untuk program QT ini mungkin baik untuk bagian Gui, manfaat dari C ++ dan RAII adalah, bahwa Anda benar-benar dapat menyimpan banyak data di stack daripada tumpukan. Saat beralih ke penulisan kode non-GUI, Anda harus mengingatnya.

wirrbel
sumber
1
poin yang saya coba sampaikan bukanlah bahwa alokasi heap umumnya buruk, itu bukan yang terbaik untuk variabel lokal. Kelas GUI cenderung berumur panjang dan paling baik dialokasikan pada heap, variabel lokal yang hanya sementara dibutuhkan hidup dengan baik di stack. di C # dengan Garbace Collection mereka akan segera dihancurkan, jadi tumpukan juga oke. Tetapi dengan new/deletepanggilan manual ini tidak mudah dan rawan kesalahan. Di bagian kritis (menangani data besar) ini dapat membuat perbedaan, terutama deletepanggilan bisa sangat lambat.
wirrbel
1
ini bukan masalah 10000 Objek UI tetapi untuk struktur data pohon yang kompleks dengan sejuta entri, dll. di mana dulu bisa menggunakan cara yang lebih cerdas untuk mengalokasikan sesuatu (Alokasi massal atau banyak kelas penambah yang ditulis dengan cerdas, dll.). Kesimpulan: tumpukan tidak buruk, itu harus digunakan dengan cerdas. Cara Qt terkadang tidak mengukur untuk hal-hal lain. Itu masih toolkit yang luar biasa menurut saya.
wirrbel
Jadi bagaimana dengan C ++ 11? pointer pintar dll tampaknya akan mengurangi banyak masalah Anda. Saya baru saja mulai mengacaukannya sekarang. Seperti yang saya katakan, saya setuju bahwa Qt KICKS BUTT. Rencana saya adalah menggunakan Qt untuk GUI dan melakukan apa pun yang saya bisa gunakan C ++ 11 - yang tampaknya membuat banyak Boost, misalnya, usang dan menutup sebagian besar kesenjangan antara Java / C # dan C ++ sekolah lama. Saya mendapatkan perasaan (pada titik ini dari kejauhan diakui) bahwa kombinasi Qt dan C ++ 11 bisa menjadi pemenang besar.
Vektor
2
Saya pikir Anda mengerti maksud saya: Anda memiliki banyak opsi dengan C ++, dengan c ++ Anda harus memilih dengan bijak. Pointer pintar, dll. Punya masalah juga. Muak dengan C # Anda bisa melihat dlang.org yang melakukan banyak hal lebih baik (GCed).
wirrbel
Sementara itu saya harus mengumpulkan rantai alat yang mendukung C ++ 11. Saya menggunakan codelite sekarang - IDE yang sangat bagus - tetapi di luar kotak (kompiler GNU) tidak mendukung 11, karena saya baru tahu ... Mungkin saya dapat menancapkan kompiler 11 compliant ke dalamnya. Tidak akan memulai dengan D atau Boo dll - seperti yang saya katakan dalam pertanyaan, saya mungkin harus segera kembali ke pasar kerja dan saya ingin memiliki bahasa utama untuk daya jual, bukan 'one offs'. BANYAK pekerjaan Python di luar sana - sayang sekali aku tidak tahan lagi dengan Python!
Vektor