Apakah Belajar C ++ Melalui Kerangka Kerja Qt Benar-Benar Belajar C ++ [ditutup]

32

Masalah yang saya miliki, adalah bahwa sebagian besar buku C ++ yang saya baca menghabiskan hampir selamanya untuk sintaks dan dasar-dasar bahasa, misalnya fordan loop while, array, daftar, pointer, dll.

Tetapi mereka tampaknya tidak pernah membangun apa pun yang cukup sederhana untuk digunakan untuk belajar, namun cukup praktis untuk membuat Anda memahami filosofi dan kekuatan bahasa.

Kemudian saya menemukan QT yang merupakan perpustakaan yang luar biasa!

Tetapi bekerja melalui demo yang mereka miliki, sepertinya saya sekarang berada dalam dilema terbalik. Saya merasa seperti anak lelaki kaya mengendarai mobil sport yang disubsidi oleh ayah. Seperti saya bisa membangun perangkat lunak yang fantastis, tetapi tidak tahu apa yang terjadi di bawah tenda.

Sebagai contoh dilema saya mengambil tugas membangun browser web sederhana. Dalam C + + murni, saya bahkan tidak tahu harus mulai dari mana, namun dengan perpustakaan Qt dapat dilakukan dalam beberapa baris pada kode.

Saya tidak mengeluh tentang ini. Saya hanya ingin tahu bagaimana mengisi kekosongan pengetahuan antara struktur dasar bahasa dan antarmuka tingkat tinggi yang disediakan kerangka Qt?

pengguna866190
sumber
Saya tidak terbiasa dengan pemrograman di Qt. Apakah itu benar-benar memperkenalkan sintaks baru atau mengubah bahasa, atau hanya beberapa perpustakaan yang sangat canggih?
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner Bukan QT adalah GUI Framework qt.nokia.com jika Anda tertarik
Karlson
Qt juga menawarkan alternatif untuk kelas dan wadah standar (misalnya QString, QList, dan sebagainya) dan banyak fasilitas lainnya. Beberapa dari mereka saya temukan lebih intuitif daripada yang standar. Saya pikir ini adalah lingkungan pemrograman yang bagus, tetapi saya akan menyarankan untuk belajar bahasa inti C ++ secara terpisah.
Giorgio
3
Jika Anda ingin mempelajari cara menerapkan Qt, cukup unduh dan lihat kode sumbernya.
user16764
1
@ Karlson Qt memang menambahkan beberapa hal ke bahasa, maka kebutuhan akan kompiler moc alias metaobject. Ini menambahkan beberapa refleksi dan membentuk dasar dari sistem sinyal / slot Qt.
Tamás Szelei

Jawaban:

11

Apakah Anda ingin tahu bagaimana menginjak pedal gas membuat mobil melaju lebih cepat, atau apakah Anda hanya peduli bahwa menginjak pedal gas membuat mobil melaju lebih cepat?

Anda melihat manfaat dari pemrograman kotak hitam, yang merupakan cara terbaik untuk merancang sistem ketika semua kotak bekerja. Seseorang harus membuat kotak hitam dan jika Anda ingin menjadi pria / wanita maka Anda perlu tahu lebih banyak tentang bahasa daripada pria yang menggunakan kotak.

Ada pekerjaan yang merupakan pekerjaan bagus di setiap gaya, jadi terserah Anda apa yang ingin Anda programkan. IMO Anda akan merugikan diri sendiri meskipun jika Anda tidak melakukan upaya untuk mengupas beberapa abstraksi QT memberi Anda pada akhirnya.

Ryathal
sumber
2
"IMO kamu akan merugikan dirimu sendiri meskipun jika kamu tidak melakukan upaya untuk mengupas beberapa abstraksi QT akhirnya memberi kamu." Hak Anda dan itulah naluri yang saya miliki
user866190
18

Kerusakan paling besar yang akan Anda lakukan untuk diri sendiri, jika Anda ingin mengatakannya, adalah bahwa Anda tidak akan belajar menggunakan struktur data C ++ standar, iterator, algoritma dan string sama sekali. Qt memiliki perpustakaan sendiri untuk semua keperluan itu, dan Anda semua terpaksa menggunakannya bukan entitas C ++ standar karena Qt API hanya menerima struktur data sendiri.

Orang bisa berpendapat bahwa belajar menggunakan satu perpustakaan algoritma setelah menguasai yang lain adalah tugas yang sepele. Sebelum pergi ke sebuah wawancara di mana pewawancara mengharapkan Anda untuk menguasai C ++, pastikan Anda berurusan dengan hal-hal sepele sebelumnya.

otto
sumber
3
Setuju- Qt menggunakan perangkat yang sama sekali berbeda untuk Standar C ++.
DeadMG
Di perusahaan kami ada perdebatan panjang apakah seseorang harus menggunakan wadah standar dan iterator atau yang Qt dan kami belum menemukan solusi: kami akhirnya menggunakan keduanya, meskipun kami tidak mencampur kedua gaya dalam modul yang diberikan. Saya merasa bahwa beralih dari Qt ke standar secara konseptual sangat mudah, walaupun itu akan memakan waktu.
Giorgio
9
Saya menggunakan wadah dan algoritma standar di dalam model rekayasa saya - yaitu logika bisnis saya. Saya menggunakan kontainer Qt di dalam kode GUI saya. Dengan cara ini model rekayasa saya dilindungi terhadap perubahan Qt dan sebaliknya. Qt memiliki cara menghubungkan wadah standar dan wadahnya.
emsr
2
Saya tidak terlalu peduli tentang wadah. Mereka bukan bagian yang paling berguna dari STL; algoritma jauh lebih penting. Karena desain STL, algoritmanya dapat dengan mudah bekerja dengan kontainer lain, dan kontainer Qt dirancang untuk bekerja dengan algoritma STL. Menang-menang, sungguh.
MSalters
12

Mempertimbangkan bahwa Qt memiliki meta-compiler sendiri yang harus Anda proses dengan file sumber Anda, sulit untuk menganggap kode Qt sebagai "hanya C ++".

Tetapi yang lebih penting, gaya C ++ yang digunakan dan didorong Qt adalah sesuatu yang, bagi kita semua, terakhir terlihat sekitar 1995.

Sungguh, ini merupakan upaya untuk membuat C ++ sebagai Java-like sedapat mungkin. Itu merindukan, atau mengecilkan hati, semua hal menakjubkan yang benar-benar membuat C ++ layak digunakan hari ini . Sebagai gantinya, Anda dikunci ke dalam subset yang sebagian besar terasa seperti Java yang lebih rendah.

Jadi jika tujuannya adalah untuk belajar C ++, saya akan mengatakan tidak, menjauhlah dari Qt. Mungkin perhatikan Boost sebagai gantinya, jika Anda ingin menggunakan pustaka yang mapan sebagai titik awal. Boost mewujudkan praktik-praktik yang dianggap baik hari ini .

Tapi jujur, jika Anda ingin belajar bahasa C ++ , maka ambil buku teks yang bagus, dan fokus pada bahasa tersebut .

Menulis peramban web, apa pun yang Anda lakukan, paling tidak akan mengajarkan Anda tentang peramban web. Itu tidak akan mengajarkan banyak tentang bahasa yang Anda gunakan.

C ++ sebagai bahasa tidak memiliki kelas WebBrowser bawaan. Jika Anda membaca standar C ++, ia tidak mengatakan apa - apa tentang peramban. Bahkan tidak menyebutkan aplikasi GUI.

Itu karena hal-hal itu dibangun di atas, disediakan oleh perpustakaan seperti Qt. C ++, seperti bahasa pemrograman apa pun, adalah tentang logika, tentang cara mengekspresikan logika itu. Dan ya, itu berarti bekerja dengan array dan pointer dan loop dan semua hal itu.

Apakah Anda dapat menulis peramban web hanya dengan menggunakan alat bawaan itu , diberikan waktu yang cukup ? Apakah Anda tahu cara mengekspresikan logika program yang terlibat? Jika tidak, maka Anda perlu menghabiskan lebih banyak waktu untuk loop dan pointer, dan lebih sedikit menelepon new QWebKit()dan hanya membonceng perpustakaan yang sudah jadi.

"Filosofi dan kekuatan bahasa" ada dalam array dan daftar dan loop, bukan di browser web.

jalf
sumber
4
Saya tidak pernah mengatakan mereka lebih baik karena mereka baru . Mereka baru dan lebih baik. Intinya adalah bahwa C ++ sebagai bahasa tidak cocok untuk pendekatan seperti Java ini. Dalam C ++, pewarisan dan runtime polimorfisme adalah hal yang menyakitkan, karena secara praktis mengharuskan Anda untuk menumpuk-mengalokasikan objek di semua tempat, yang membuat bahasa tersebut memiliki reputasi untuk kebocoran memori sejak awal, karena rentan terhadap kesalahan pengirisan, karena itu membuat menyalin objek lebih sulit. Ini juga tidak efisien, kurang dapat dikembangkan, dan membutuhkan kode boilerplate yang lebih membosankan.
Jalf
2
Heck, Qt membutuhkan meta-compiler sendiri hanya untuk membuat gaya pemrograman mereka dapat bertahan lama . Bukankah itu memberitahumu sesuatu?
Jalf
4
Saya tidak membela Qt dengan sendirinya (saya melihat banyak keterbatasan di dalamnya sendiri). Pernyataan Anda "gaya C ++ yang digunakan dan didorong Qt adalah sesuatu yang, bagi kita semua, terakhir terlihat sekitar 1995." Dengan formulasi ini, tidak jelas apa yang buruk dengan gaya ini (selain itu usianya 15 tahun) dan apa alternatif saat ini, yang lebih baik. Mungkin jika Anda lebih spesifik apa yang Anda maksudkan akan menjadi lebih jelas.
Giorgio
3
@ JimimTexas: ini juga ada sebelum C ++. Poin Anda? Pada awal-pertengahan 90-an, C ++ adalah binatang yang sangat berbeda. Itu jauh lebih dekat dengan apa yang akhirnya menjadi Jawa daripada sekarang.
Jalf
3
@ JimInTexas: Ya, itu salah, tapi semoga juga cukup jelas apa yang saya maksud. Ini adalah upaya untuk mencapai tujuan desain Java, di C ++. Ini merupakan upaya untuk mengimplementasikan model OOP cacat yang sama yang diterapkan java.
Jalf
9

Apakah Belajar C ++ Melalui Kerangka Kerja Qt Benar-Benar Belajar C ++

Mungkin.

Saya harus melihat kode yang Anda masukkan ke penangan acara Anda.

Sungguh, jangan terobsesi dengan seberapa banyak Anda "tahu". Kita semua menggunakan kerangka kerja windowing dan kita semua masih belajar. Teruslah koding / baca hal-hal baru dan Anda akan terus belajar C ++. Mempelajari kerangka kerja windowing baru adalah tambahan yang bagus untuk keterampilan Anda, bahkan jika itu tidak berarti Anda dapat mengimplementasikan jaringan saraf atau quicksort di C ++.

brian
sumber
5

Jangan khawatir; pada awalnya sebagian besar kode Anda hanya akan menggunakan kerangka kerja, tetapi setelah beberapa saat Anda harus memperpanjangnya , meskipun hanya sedikit. Maka Anda harus menggunakan lebih banyak C ++.

Juga ingat bahwa Anda memiliki seluruh sumber Qt yang tersedia, IDE dengan senang hati akan membawa Anda ke definisi fungsi / metode / kelas yang Anda inginkan. Semakin dalam Anda pergi, semakin banyak C ++ yang akan Anda lihat.

Yang lain telah menyebutkan tentang perbedaan antara Qt C ++ dan standar C ++. Ini jatuh di dua kubu:

  • pustaka yang berbeda: Qt mencakup semua kontainer yang biasa: array, daftar, set, hashmaps, dll. Mereka cocok dengan sangat baik dan implementasi yang baik, tetapi mereka bukan varietas STD. Namun, dalam versi terbaru (4.1 dan yang lebih baru, saya pikir) mereka memiliki API 'seperti STD' selain variasi lama (dan API mirip Java). Pada akhirnya, pilihan desain (kapan harus menggunakan array, kapan harus menggunakan hashmap) adalah sama, jadi mengubah ke STD untuk proyek-proyek non-Qt tidak terlalu sulit.

  • mocpenambahan sintaksis: kebanyakan untuk penanganan sinyal, tetapi juga beberapa konstruksi loop yang lebih bagus. Banyak orang merasa alat ini berarti bukan C ++ lagi; tapi IMHO, mereka merasa seperti makro yang sedikit lebih pintar. Penanganan sinyal yang digabungkan dengan longgar merupakan keuntungan besar dari kerangka kerja yang baik, dan sangat sulit dilakukan pada bahasa yang diketik secara statis. Di C ++ modern, ini bisa dilakukan dengan template dalam dosis besar; tapi itu jauh dari standar ketika Qt pertama kali didapat moc. Pada akhirnya, jika nanti Anda ingin melakukan proyek non-Qt, periksa dulu apakah Anda akan menggunakan kerangka kerja apa pun dan apakah ada sinyal. Jika ya, maka sebagian besar yang biasa Anda lakukan dengan Qt akan berlaku, jadi tidak ada 'salahnya' dalam mempelajari Qt terlebih dahulu.

Javier
sumber
Perbaikan loop apa yang diberikan oleh moc?
Basile Starynkevitch
@ Basile Starynkevitch: Mungkin dia merujuk ke loop foreach (yang saya gunakan sangat banyak). Ini adalah tambahan sintaksis tetapi, ASAIK, ini tidak ada hubungannya dengan moc. Jadi Anda benar bahwa mungkin jawabannya harus dirumuskan dengan cara yang berbeda.
Giorgio
foreachhanyalah makro .... (sebenarnya "alias" untuk Q_FOREACHdidefinisikan dalam <Qt/qglobal.h>). Saya tidak berpikir itu mocsedang memprosesnya. Dan C ++ 11 memiliki for (auto it : container)konstruk!
Basile Starynkevitch
@Basile Starynkevitch: Mungkin Qt akan membutuhkan rekayasa ulang yang mendalam jika harus pindah ke C ++ 11: Qt dirancang untuk C ++ (dan juga mencoba mengatasi beberapa keterbatasannya) sehingga beberapa solusi tidak diperlukan dengan C ++ 11.
Giorgio
1
Saya menggunakan Qt dan Boost. Ada banyak tumpang tindih antara kedua perpustakaan, tetapi Qt jauh lebih mudah untuk dipelajari.
Jim In Texas
4

Qt digunakan secara luas di dunia komersial karena menyediakan toolset lintas platform penuh dan lingkungan pengembangan, termasuk perpustakaan GUI yang baik.

Ini juga sepenuhnya mendukung internasionalisasi, termasuk alat 'Ahli Bahasa' yang sangat baik.

Jika Anda merencanakan karier akademik maka saya tidak akan repot dengan Qt. Jika, di sisi lain, Anda menyukai C ++ dan ingin belajar keterampilan yang berharga maka Qt patut dipelajari.

Dan ya, Qt adalah C ++, dan Anda dapat mencampur standar dan meningkatkan pustaka ke konten Anda jika itu membuat Anda merasa lebih baik.

Jim In Texas
sumber
3

Adalah ide yang buruk untuk mempelajari C ++ sampai Qt. Pertama, Anda harus mempelajari konsep bahasa yang independen dari kerangka kerja apa pun dan itulah yang akan diajarkan oleh c ++ buku kepada Anda dan mereka benar. Pada dasarnya, 'for dan loops while, array, list, pointer' adalah bahasa pemrograman. Fungsionalitas tambahan disediakan oleh kerangka kerja. Setelah Anda belajar bahasa pemrograman, Anda dapat mempelajari kerangka kerja seperti Qt atau MFC yang dibangun menggunakan bahasa tersebut, sehingga aplikasi dapat dikembangkan dengan cepat. Mengenai Qt, setelah Anda belajar c ++, itu adalah kerangka kerja yang sangat baik yang membuat Anda sama produktifnya dengan pengembang Java atau .Net apa pun. Sebentar lagi Anda akan dapat mengembangkan aplikasi iOS dan Android menggunakan Qt.

Jaak
sumber
2

Yah, saya pikir cara terbaik untuk belajar C ++ adalah dengan menggunakan sintaks HANYA sendiri (Standar C ++), jadi Anda akan dapat menggunakan hal-hal LANGUAGE, dan BUKAN Qt (atau kerangka kerja lain, perpustakaan ... dll).

Mengapa? karena sebagai seorang pemula, ketika Anda melihat kode C ++ yang dicampur dengan kode Non-C ++ lainnya (Qt dalam kasus ini) Anda tidak akan dapat melihat apa hal-hal C ++ dan apa yang tidak, melainkan akan menjadi proses yang lebih kompleks.

CVist
sumber