C ++ ile Qt Framework Yoluyla Gerçekten Öğreniyor mu C ++ Öğreniyor [kapalı]


32

Sahip olduğum sorun, okuduğum C ++ kitaplarının çoğunun neredeyse sonsuza dek sözdizimi ve dilin temelleri, örneğin forve döngüler while, diziler, listeler, işaretçiler vb.

Fakat asla öğrenme için kullanacak kadar basit, dilin felsefesini ve gücünü anlamanıza yetecek kadar pratik bir şey inşa edecek gibi görünmüyorlar.

Sonra tökezledi QT inanılmaz kütüphanesi olan!

Ama sahip oldukları demolarla çalışmak, şimdi ters ikilemde olduğum anlaşılıyor. Zengin adamın oğlunun, babasının sübvanse ettiği bir spor otomobilde dolaştığını hissediyorum. Mesela harika bir yazılım geliştirebildim, ama kaputun altında ne olduğu hakkında hiçbir fikrim yok.

İkilemimin bir örneği olarak basit bir web tarayıcısı oluşturma görevini üstleniyorum. Saf C ++ 'da nereden başlayacağımı bile bilmiyorum, ancak Qt kütüphanesi ile kod üzerinde birkaç satırda yapılabilir.

Bundan şikayet etmiyorum. Sadece dilin temel yapısı ile Qt çerçevesinin sağladığı üst düzey arayüz arasındaki boşluğu nasıl dolduracağımı merak ediyorum.


Qt. İle programlama bilgisine sahip değilim. Gerçekten yeni bir sözdizimi sunuyor mu veya dili değiştiriyor mu, yoksa sadece çok karmaşık kütüphaneler mi?
SinirliFormsDesigner'la

Bu QT GUI Çerçeve vermezse @FrustratedWithFormsDesigner qt.nokia.com eğer sizsiniz, ilgilenen
Karlson

Qt ayrıca standart sınıflara ve konteynırlara (örneğin QString, QList, vb.) Ve birçok başka tesise alternatif sunar. Bazılarını standart olanlardan daha sezgisel buluyorum. Güzel bir programlama ortamı olduğunu düşünüyorum, ancak çekirdek C ++ dilini ayrı ayrı öğrenmenizi tavsiye ederim.
Giorgio

3
QT'nin nasıl uygulandığını öğrenmek istiyorsanız, kaynak kodunu indirin ve bakın.
user16764

1
@Karlson Qt dile bazı şeyler ekliyor, bu nedenle moc aka metaobject derleyicisine ihtiyaç var. Bu biraz yansıma ekler ve Qt'un sinyal / slot sisteminin temelini oluşturur.
Tamás Szelei

Yanıtlar:


11

Hızlandırıcı üzerine basmanın aracın daha hızlı gitmesini nasıl sağladığını bilmek ister misiniz, yoksa sadece gaz pedalına basmanın otomobili daha hızlı yapmasını mı sağlıyorsunuz?

Tüm kutular çalıştığında sistem tasarlamanın harika bir yolu olan kara kutu programlamanın faydasını görüyorsunuz. Birisinin kara kutuları yapması gerekiyor ve eğer o adam / kız olmak istiyorsanız, dil hakkında kutuyu kullanan adamdan daha fazla şey bilmeniz gerekiyor.

Her stilde iyi işler olan işler var, bu yüzden programlamak istediğiniz şey size kalmış. IMO, QT'nin size verdiği soyutlamanın bir kısmını geri soyma çabası olmasa da, kendinize bir kötülük yapıyor olacaktınız.


2
“IMO kendinize bir kötülük yapıyor olacaksınız, ancak QT'nin size soyutlama yönteminin bir kısmını geri alma çabası vermediyseniz,” Haklısın ve şu içgüdüsel duyguyu
user866190

18

Kendinize vereceğiniz en büyük hasar, bu şekilde koymak istiyorsanız, standart C ++ veri yapılarını, yineleyicileri, algoritmaları ve dizeleri kullanmayı öğrenmeyeceğinizdir. Qt'nin tüm bu amaçlara yönelik kendi kütüphaneleri vardır ve hepiniz onları standart C ++ varlıkları yerine kullanmak zorundasınız, çünkü Qt API'leri yalnızca kendi veri yapılarını kabul ediyor.

Biri, diğerine hakim olduktan sonra bir algoritma kütüphanesini kullanmayı öğrenmenin önemsiz bir görev olduğunu iddia edebilir. Görüşme yapanların C ++ 'da uzman olmanızı beklediği bir görüşmeye gitmeden önce, bu önemsizliği önceden ele aldığınızdan emin olun.


3
Kabul - Qt, tamamen standart C ++ 'a tamamen farklı bir araç seti kullanır.
DeadMG

Şirketimizde standart konteynırları ve yineleyicileri mi yoksa Qt olanlarını mı kullanmamız gerektiğine dair uzun bir tartışma vardı ve henüz bir çözüm bulamadık: iki tarzı bir arada kullanmasak da ikisini birden kullandık verilen modül. QT'den standarda geçmenin biraz zaman alacağına rağmen kavramsal olarak çok kolay olduğunu hissediyorum.
Giorgio

9
Mühendislik konteynerlerimde standart kapları ve algoritmaları kullanıyorum - yani iş mantığım. GUI kodumda Qt kapları kullanıyorum. Bu şekilde mühendislik modelleri Qt ve tersi değişikliklere karşı korunur. Qt, standart konteynerleri ve konteynerlerini bağlama yollarına sahiptir.
emsr,

2
Zaten konteynerler hakkında o kadar da umrumda değil. STL'nin en faydalı parçası değillerdir; algoritmalar çok daha önemlidir. STL'nin tasarımı nedeniyle, algoritmaları diğer kaplarla kolayca çalışabilir ve Qt kapları STL algoritmalarıyla çalışacak şekilde tasarlanmıştır. Kazan-kazan, gerçekten.
MSalters

12

Qt'nin kaynak dosyalarınızı işlemesi gereken kendi meta-derleyicisi olduğunu göz önünde bulundurarak, Qt kodunu "sadece C ++" olarak düşünmek zor.

Fakat daha da önemlisi, Qt'nin kullandığı ve teşvik ettiği C ++ tarzı , geri kalanımız için en son 1995 yılında görülen bir şey.

Gerçekten, C ++ 'ı Java gibi olabildiğince mümkün kılma denemesi. Bugün C ++ 'ı kullanmaya değer kılan inanılmaz şeyleri kaçırıyor ya da cesaretini kırıyor . Bunun yerine, çoğu aşağılık bir Java gibi hissettiren bir altküme kilitlenirsiniz.

Yani amaç C ++ öğrenmekse, hayır derim, Qt'den uzak durun. Yerleşik bir kütüphaneyi başlangıç ​​noktası olarak kullanmak istiyorsanız, belki de bunun yerine Boost'a bakın. Boost, bugün iyi olarak kabul edilen uygulamaları temsil ediyor .

Ama dürüst olmak gerekirse, eğer C ++ dilini öğrenmek istiyorsanız , o zaman iyi bir ders kitabı alın ve dile odaklanın .

Bir web tarayıcısı yazmak, nasıl yaparsanız yapın, en iyi ihtimalle size web tarayıcılarını öğretecektir. Size kullandığınız dil hakkında çok şey öğretmez.

Dil olarak C ++, yerleşik bir WebBrowser sınıfına sahip değildir. C ++ standardını okursanız, tarayıcılar hakkında hiçbir şey söylemez . GUI uygulamalarından bile bahsetmiyor.

Çünkü bu şeyler Qt gibi kütüphaneler tarafından sağlanıyor . C ++, herhangi bir programlama dili gibi, mantık hakkında, bu mantığın nasıl ifade edileceği hakkındadır. Ve evet, bu diziler, işaretçiler ve döngülerle ve diğer şeylerle çalışmak anlamına gelir.

Yeterli zaman vererek sadece bu yerleşik araçları kullanarak bir web tarayıcısı yazabiliyor musunuz? İlgili program mantığını nasıl ifade edeceğinizi biliyor musunuz? Değilse, o zaman döngüler ve işaretçiler için daha fazla zaman harcamanız ve daha az arama yapmanız new QWebKit()ve hazır kütüphaneleri geri çağırmanız yeterlidir .

"Dilin felsefesi ve gücü" web tarayıcılarında değil, dizilerde, listelerde ve döngülerdedir.


4
Daha iyi olduklarını söylemedim, çünkü yeniler . Onlar yeni ve daha iyiler. Mesele şu ki, dil olarak C ++ bu Java benzeri yaklaşım için pek de uygun değil. C ++ 'da kalıtım ve çalışma zamanı polimorfizmi bir acıdır, çünkü pratikte her yerde nesneleri yığınla ayırmanızı gerektirir, bu da diline bellek sızıntıları için ününü veren şeydir, çünkü dilimleme hatalarına neden olur, çünkü nesnelerin kopyalanmasını zorlaştırır. Aynı zamanda verimsiz, daha az genişletilebilir ve daha sıkıcı kazan plakası kodu gerektiriyor.
jalf

2
Heck, Qt'un sadece programlama stilini kolaylaştırmak için kendi meta-derleyicisine ihtiyacı var . Bu sana bir şey söylemiyor mu?
jalf

4
Qt'yi kendi içinde savunmuyordum (kendimde birçok kısıtlama görüyorum). İfadeniz "Qt'nin kullandığı ve teşvik ettiği C ++ tarzı, geri kalanımız için en son 1995 yılında görülen bir şey." Bu formülle, bu stille neyin kötü olduğu (15 yaşından büyük) ve şu an daha iyi olan alternatiflerin ne olduğu açık değildir. Belki daha spesifik iseniz ne demek istediğinizi netleşir.
Giorgio

3
@JimInTexas: ayrıca C ++ 'ı da öneriyor. Puanınız? 90'ların ortalarında, C ++, çok farklı bir canavardı. Sonunda Java olanlara bugün olduğundan çok daha yakındı.
jalf,

3
@JimInTexas: Evet, yanlış, ama ne dediğimi açık bir şekilde açıklamalıdır. C ++ 'ta Java'nın tasarım hedeflerine ulaşmak için bir girişimdir. Java'nın uyguladığı kusurlu OOP modelini uygulama girişimi .
jalf,

9

C ++ ile Qt Framework aracılığıyla gerçekten C ++ öğrenme mi

Olabilir.

Etkinlik işleyicilerinize koyduğunuz kodu görmek zorunda kalacağım.

Gerçekten de, ne kadar "bildiğini" saplantı haline getirme. Hepimiz pencereleme çerçevelerini kullanıyoruz ve hepimiz hala öğreniyoruz. Sadece kod yazmaya / yeni şeyler okumaya devam edin ve C ++ öğrenmeye devam edin. Yeni bir pencereleme çerçevesi öğrenmek, C ++ 'da bir sinir ağı veya hızlı erişim noktası uygulayabileceğiniz anlamına gelmese bile becerilerinize mükemmel bir katkı sağlar.


5

Endişelenme; ilk başta kodunuzun çoğu sadece çerçeveyi kullanacak , ancak bir süre sonra biraz da olsa genişletmek zorunda kalacaksınız . O zaman daha fazla C ++ kullanmanız gerekir.

Ayrıca mevcut tüm Qt kaynağına sahip olduğunuzu unutmayın, IDE sizi mutlulukla istediğiniz herhangi bir fonksiyon / yöntem / sınıf tanımına götürecektir. Ne kadar derine gidersen, o kadar fazla C ++ göreceksin.

Diğerleri ise Qt C ++ ile standart C ++ arasındaki farktan bahsetti. Bunlar iki kampta düşüyor:

  • farklı kütüphane: Qt olağan kapları içerir: diziler, listeler, kümeler, hashpalar, vs. Birbirlerine çok iyi uyuyorlar ve iyi uygulamalar, ancak STD çeşitleri değiller. Yine de, son sürümlerinde (4.1 ve üstü, sanırım) eski çeşitlere ek olarak 'STD benzeri' API'ler (ve bir Java benzeri API) var. Sonunda, tasarım seçimleri (ne zaman bir dizi, ne zaman ne zaman kullanılacağı) aynıdır, bu yüzden Qt olmayan projeler için STD'ye değiştirmek çok zor değil.

  • mocsözdizimi ilaveleri: çoğunlukla sinyal işleme için, fakat aynı zamanda birkaç hoş döngü yapısı için. Birçok insan bu aracın artık C ++ olmadığı anlamına geliyor; ancak IMHO, biraz daha akıllı makrolar gibi hissediyorlar. Gevşek bir şekilde bağlanmış iyi bir sinyal işleme, iyi bir çerçevenin çok büyük bir avantajıdır ve statik olarak yazılmış bir dilde yapılması oldukça zordur. Modern C ++ 'da ağır doz şablonlarla yapılabilir; ama Qt ilk geldiğinde bu standart olmaktan uzaktı moc. Sonunda, daha sonra Qt olmayan projeler yapmak istiyorsanız, önce herhangi bir çerçeve kullanıp kullanmadığınızı ve sinyalleri olup olmadığını kontrol edin. Eğer evetse, o zaman Qt ile yapmaya alışkın olduğunuz şeylerin çoğu geçerli olacaktır, bu yüzden önce Qt öğrenmede 'zarar' yoktur.


Hangi döngü geliştirmeleri moc?
Basile Starynkevitch

@Basile Starynkevitch: Belki de (yoğun kullandığım) foreach döngüsüne işaret ediyor. Bu bir sözdizimi eklemesidir, ancak ASAIK, bunun moc ile ilgisi yoktur. Yani haklısın belki de cevabı farklı bir şekilde formüle edilmelidir.
Giorgio

foreachsadece bir makrodur .... (aslında Q_FOREACHiçinde tanımlanacak bir "diğer ad" <Qt/qglobal.h>). Bunun işlediğini sanmıyorum moc. C ++ 11'in de for (auto it : container)yapısı var!
Basile Starynkevitch

@Basile Starynkevitch: Muhtemelen Q ++ C ++ 11'e geçmek zorundaysa, derinlemesine bir yeniden yapılandırmaya ihtiyaç duyacaktı: Qt, C ++ için tasarlandı (ve ayrıca bazı sınırlamalarının üstesinden gelmeye çalıştı), bu nedenle bazı çözümlerine C ile ihtiyaç duyulmuyordu. ++ 11.
Giorgio

1
Hem Qt hem de Boost kullanıyorum. İki kitaplık arasında çok fazla çakışma var, ancak Qt'nin öğrenilmesi daha kolaydır.
Teksas'taki Jim,

4

Qt ticari dünyada yaygın bir şekilde kullanılmaktadır çünkü iyi bir GUI kütüphanesi de dahil olmak üzere tam bir çapraz platform araç takımı ve geliştirme ortamı sağlar.

Ayrıca mükemmel 'Dilbilimci' aracı da dahil olmak üzere uluslararasılaşmayı da destekliyor.

Eğer akademik bir kariyer planlıyorsan Qt ile uğraşmazdım. Diğer yandan, C ++ 'ı seviyorsanız ve pazarlanabilir bir beceri öğrenmek istiyorsanız, Qt öğrenmeye değer.

Ve evet, Qt C ++ 'dır ve eğer kendinizi daha iyi hissettiriyorsa, standart içinde karıştırabilir ve kütüphaneleri kalp içeriğinize yükseltebilirsiniz.


3

Qt ile C ++ öğrenmek kötü bir fikirdir. Öncelikle, herhangi bir çerçeveden bağımsız olarak dil kavramlarını öğrenmelisiniz ve bu c ++ kitaplarının size öğreteceği ve haklı oldukları şeydir. Temel olarak, 'için ve döngüler sırasında, diziler, listeler, işaretçiler' programlama dillerinin ne hakkında olduğu. Ek işlevler çerçeveler tarafından sağlanır. Bir programlama dilini öğrendikten sonra, dilleri kullanarak oluşturulan Qt veya MFC gibi herhangi bir çerçeveyi öğrenebilirsiniz, böylece uygulamalar hızlı bir şekilde geliştirilebilir. Qt ile ilgili olarak, c ++ 'ı bir kez öğrendiğinizde, sizi herhangi bir Java ya da .NET geliştiricisi kadar üretken kılan mükemmel bir çerçevedir. Kısaca Qt kullanarak ios ve Android uygulamaları geliştirebileceksiniz.


2

Bence C ++ 'ı öğrenmenin en iyi yolu SADECE kendi sözdizimini kullanmaktır (Standart C ++), yani LANGUAGE öğelerini kullanacaksınız, Qt (ya da başka herhangi bir çerçeveyi, kütüphaneyi vb.) Kullanamayacaksınız.

Niye ya? çünkü yeni başlayanlar için, diğer C ++ kodlarıyla karıştırılan herhangi bir C ++ koduna baktığınızda (bu durumda Qt), C ++ 'nın ne olduğunu ve ne olmadığını görmek yerine, daha karmaşık bir süreç olacağını göremezsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.