L'apprendimento del C ++ attraverso il framework Qt è davvero l'apprendimento del C ++ [chiuso]


32

Il problema che ho è che la maggior parte dei libri in C ++ che leggo trascorrono quasi per sempre sulla sintassi e sulle basi del linguaggio, ad esempio forloop whilee array, elenchi, puntatori, ecc.

Ma non sembrano mai costruire qualcosa che sia abbastanza semplice da usare per l'apprendimento, ma abbastanza pratico da farti capire la filosofia e il potere della lingua.

Poi mi sono imbattuto in QT, che è una biblioteca incredibile!

Ma lavorando attraverso le demo che hanno, sembra che ora sia nel dilemma opposto. Mi sento come il figlio del ricco che guida in un'auto sportiva sovvenzionata dal padre. Come se potessi creare un software fantastico, ma non ho idea di cosa stia succedendo sotto il cofano.

Come esempio del mio dilemma, ho il compito di creare un semplice browser web. In puro C ++, non saprei nemmeno da dove cominciare, ma con la libreria Qt si può fare in poche righe di codice.

Non mi lamento di questo. Mi sto solo chiedendo come colmare il vuoto di conoscenza tra la struttura di base della lingua e l'interfaccia di alto livello fornita dal framework Qt?


Non ho familiarità con la programmazione in Qt. In realtà introduce qualche nuova sintassi o cambia la lingua o sono solo alcune librerie molto sofisticate?
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner Non è QT il framework GUI qt.nokia.com se sei interessato
Karlson,

Qt offre anche un'alternativa alle classi e ai contenitori standard (ad es. QString, QList e così via) e molte altre strutture. Alcuni di essi li trovo ancora più intuitivi di quelli standard. Penso che sia un bell'ambiente di programmazione, ma consiglierei di imparare separatamente il linguaggio C ++ di base.
Giorgio,

3
Se vuoi imparare come viene implementato Qt, scarica e guarda il suo codice sorgente.
user16764

1
@Karlson Qt aggiunge alcune cose al linguaggio, quindi la necessità del compilatore meta-oggetto moc aka. Ciò aggiunge qualche riflessione e costituisce la base del sistema di segnali / slot di Qt.
Tamás Szelei,

Risposte:


11

Vuoi sapere come premere l'acceleratore per rendere l'auto più veloce, o ti interessa solo che premere l'acceleratore per rendere l'auto più veloce?

Stai vedendo il vantaggio della programmazione di scatole nere, che è un ottimo modo per progettare un sistema quando tutte le scatole funzionano. Qualcuno deve creare le scatole nere e se vuoi essere quel ragazzo / ragazza allora devi sapere di più sulla lingua rispetto al ragazzo che usa la scatola.

Ci sono lavori che sono buoni lavori in ogni stile, quindi dipende da te quello che vuoi programmare. IMO ti staresti facendo un cattivo servizio, anche se se non avessi fatto lo sforzo di staccare parte dell'astrazione che QT ti sta dando alla fine.


2
"IMO ti staresti facendo un cattivo servizio, anche se se non avessi fatto lo sforzo di staccare parte dell'astrazione che QT ti sta dando alla fine."
Hai

18

Il maggior danno che arrecherai a te stesso, se vuoi dirlo in quel modo, è che non imparerai a usare le strutture di dati C ++ standard, iteratori, algoritmi e stringhe. Qt ha librerie proprie per tutti questi scopi e sei quasi obbligato a usarle al posto delle entità C ++ standard perché le API Qt accettano solo strutture di dati proprie.

Si potrebbe sostenere che imparare a usare una libreria di algoritmi dopo averne acquisito la padronanza di un altro è un compito banale. Prima di andare a un'intervista in cui gli intervistatori si aspettano che tu padroni il C ++, assicurati di affrontare prima quella banalità.


3
Concordato: Qt utilizza un set di strumenti completamente diverso rispetto allo Standard C ++.
DeadMG

Nella nostra azienda si è discusso a lungo se si dovrebbero usare i contenitori standard e gli iteratori o quelli Qt e non abbiamo ancora trovato una soluzione: abbiamo finito per usare entrambi, anche se non mescoliamo i due stili in un modulo dato. Ho la sensazione che passare da Qt a standard sia concettualmente molto semplice, anche se ci vorrà del tempo.
Giorgio,

9
Uso i container e gli algoritmi standard all'interno dei miei modelli di ingegneria, ovvero la mia logica aziendale. Uso i contenitori Qt nel mio codice GUI. In questo modo i miei modelli di ingegneria sono protetti dalle modifiche in Qt e viceversa. Qt ha modi di collegare i contenitori standard e i loro contenitori.
emsr

2
In ogni caso non mi interessa molto dei container. Non sono la parte più utile dell'STL; gli algoritmi sono molto più importanti. Grazie al design di STL, i suoi algoritmi possono funzionare facilmente con altri contenitori e i contenitori Qt sono progettati per funzionare con algoritmi STL. Win-win, davvero.
MSalter

12

Considerando che Qt ha un proprio meta-compilatore con cui devi elaborare i tuoi file sorgente, è difficile considerare il codice Qt come "solo C ++".

Ma ancora più importante, lo stile di C ++ che Qt usa e incoraggia è qualcosa che, per il resto di noi, è stato visto per l'ultima volta intorno al 1995.

In realtà, è un tentativo di rendere il C ++ il più possibile simile a Java. Manca o scoraggia tutte le cose straordinarie che rendono il C ++ degno di essere utilizzato oggi . Invece, sei bloccato in un sottoinsieme che sembra quasi un Java inferiore.

Quindi, se l'obiettivo è imparare il C ++, direi di no, stai lontano da Qt. Forse dai un'occhiata a Boost invece, se vuoi usare una libreria consolidata come punto di partenza. Boost incarna le pratiche che sono considerate buone oggi .

Ma onestamente, se vuoi imparare il linguaggio C ++ , prendi un buon libro di testo e concentrati sul linguaggio .

Scrivere un browser Web, non importa come lo fai, ti insegnerà al meglio sui browser Web. Non ti insegnerà molto sulla lingua che stai usando.

C ++ come linguaggio non ha una classe WebBrowser integrata. Se leggi lo standard C ++, non dice nulla sui browser. Non menziona nemmeno le applicazioni della GUI.

Questo perché quelle cose sono costruite in cima, fornite da librerie come Qt. Il C ++, come qualsiasi linguaggio di programmazione, parla di logica, di come esprimere quella logica. E sì, questo significa lavorare con array, puntatori e loop e tutte quelle cose.

Saresti in grado di scrivere un browser Web utilizzando solo quegli strumenti integrati, con un tempo sufficiente ? Sapresti come esprimere la logica del programma in questione? In caso contrario, è necessario dedicare più tempo ai loop e ai puntatori, a meno chiamate new QWebKit()e solo alle spalle delle librerie pronte.

La "filosofia e il potere della lingua" è negli array, negli elenchi e nei loop, non nei browser web.


4
Non ho mai detto che fossero migliori perché sono nuovi . Sono nuovi e sono migliori. Il punto è che C ++ come linguaggio non è proprio adatto a questo approccio simile a Java. In C ++, il polimorfismo dell'ereditarietà e del runtime è una seccatura, perché praticamente ti richiede di allocare oggetti in tutto il luogo, il che è ciò che ha dato al linguaggio la sua reputazione per perdite di memoria in primo luogo, perché è incline a tagliare errori, perché rende più difficile la copia di oggetti. È anche inefficiente, meno estensibile e richiede un codice di caldaia più noioso.
jalf

2
Diamine, Qt ha bisogno del proprio meta-compilatore solo per rendere sopportabile il loro stile di programmazione . Non ti dice qualcosa?
jalf

4
Non stavo difendendo Qt in sé (vedo molte limitazioni in me stesso). La tua affermazione "lo stile di C ++ che Qt usa e incoraggia è qualcosa che, per il resto di noi, è stato visto per l'ultima volta intorno al 1995." Con questa formulazione non è chiaro cosa c'è di male in questo stile (a parte il fatto che ha 15 anni) e quali sono le alternative migliori e attuali. Forse se sei più specifico, ciò che intendi diventerà più chiaro.
Giorgio,

3
@JimInTexas: precede anche C ++. Il tuo punto? All'inizio della metà degli anni '90, il C ++ era una bestia molto diversa. Era molto più vicino a quello che alla fine divenne Java di quanto lo sia oggi.
jalf

3
@JimInTexas: Sì, è sbagliato, ma si spera anche che sia abbastanza chiaro cosa intendo. È un tentativo di raggiungere gli obiettivi di progettazione di Java, in C ++. È un tentativo di implementare lo stesso modello OOP imperfetto che java implementa.
jalf

9

L'apprendimento del C ++ attraverso il framework Qt è davvero l'apprendimento del C ++

Può essere.

Dovrei vedere il codice che stai inserendo nei gestori di eventi.

Davvero, non essere ossessionato da quanto "sai". Usiamo tutti framework per finestre e stiamo ancora imparando. Continua a scrivere codice / a leggere nuove cose e continuerai ad imparare il C ++. Imparare un nuovo framework per finestre è una grande aggiunta alle tue abilità anche se potrebbe non significare che puoi implementare una rete neurale o un quicksort in C ++.


5

Non ti preoccupare; in un primo momento la maggior parte del codice sarà solo utilizzare il quadro, ma dopo un po 'si dovrà estendere , anche se solo un po'. Quindi dovrai usare sempre più C ++.

Ricorda anche che hai l'intera fonte di Qt disponibile, l'IDE ti porterà felicemente alla definizione di qualsiasi funzione / metodo / classe che desideri. Più vai in profondità, più C ++ vedrai.

Altri hanno menzionato la differenza tra Qt C ++ e C ++ standard. Questi rientrano in due campi:

  • libreria diversa: Qt include tutti i normali contenitori: array, elenchi, set, hashaps, ecc. Si adattano molto bene e sono buone implementazioni, ma non sono la varietà STD. Tuttavia, nelle versioni recenti (4.1 e successive, penso) hanno API 'simili a STD' oltre alla vecchia varietà (e un'API simile a Java). Alla fine, le scelte di progettazione (quando usare un array, quando usare un hashmap) sono le stesse, quindi passare a STD per progetti non Qt non è così difficile.

  • mocaggiunte di sintassi: principalmente per la gestione del segnale, ma anche un paio di costruzioni ad anello più belle. Molte persone pensano che questo strumento non sia più C ++; ma IMHO, si sentono proprio come macro leggermente più intelligenti. Una buona gestione del segnale liberamente accoppiata è un enorme vantaggio di un buon framework ed è notoriamente difficile da eseguire su un linguaggio tipizzato statico. Nel moderno C ++, è fattibile con una pesante dose di template; ma quello era lontano dallo standard quando Qt arrivò per la prima volta moc. Alla fine, se in seguito desideri realizzare progetti non Qt, controlla prima se utilizzerai un framework e se ha dei segnali. Se sì, allora si applicherà la maggior parte di ciò che sei abituato a fare con Qt, quindi nessun "danno" nell'apprendimento di Qt prima.


Quali sono i miglioramenti del loop moc?
Basile Starynkevitch

@Basile Starynkevitch: Forse si riferisce al ciclo foreach (che uso pesantemente). Questa è un'aggiunta di sintassi ma, ASAIK, non ha nulla a che fare con Moc. Quindi hai ragione, forse la risposta dovrebbe essere formulata in modo diverso.
Giorgio,

foreachè solo una macro .... (in realtà un "alias" in cui Q_FOREACHdefinire <Qt/qglobal.h>). Non penso che lo mocstia elaborando. E C ++ 11 ha il for (auto it : container)costrutto!
Basile Starynkevitch

@Basile Starynkevitch: Probabilmente Qt avrebbe bisogno di una profonda reingegnerizzazione se dovesse passare a C ++ 11: Qt è stato progettato per C ++ (e ha anche cercato di superare alcuni dei suoi limiti) quindi alcune delle sue soluzioni non sono necessarie con C ++ 11.
Giorgio,

1
Uso sia Qt che Boost. C'è molta sovrapposizione tra le due librerie, ma Qt è molto più facile da imparare.
Jim In Texas,

4

Qt è ampiamente utilizzato nel mondo commerciale perché fornisce un set completo di strumenti e un ambiente di sviluppo multipiattaforma, inclusa una buona libreria GUI.

Supporta inoltre completamente l'internazionalizzazione, incluso l'eccellente strumento "linguista".

Se pianifichi una carriera accademica, non mi preoccuperei di Qt. Se, d'altra parte, ti piace il C ++ e vuoi imparare un'abilità commerciabile, allora vale la pena imparare Qt.

E sì, Qt è C ++ e puoi mescolare lo standard e aumentare le librerie al contenuto del tuo cuore se questo ti fa sentire meglio.


3

È una cattiva idea imparare il C ++ attraverso Qt. Per prima cosa devi imparare i concetti linguistici indipendentemente da qualsiasi framework ed è quello che ti insegneranno i libri di c ++ e hanno ragione. Fondamentalmente, "for e loop while, array, list, pointers" sono i linguaggi di programmazione. Funzionalità aggiuntive sono fornite dai framework. Dopo aver appreso un linguaggio di programmazione, è possibile apprendere qualsiasi framework come Qt o MFC creato utilizzando il linguaggio, in modo che le applicazioni possano essere sviluppate rapidamente. Per quanto riguarda Qt, una volta imparato c ++, è un eccellente framework che ti rende produttivo come qualsiasi sviluppatore Java o .Net. A breve sarai in grado di sviluppare app iOS e Android usando Qt.


2

Bene, penso che il modo migliore per imparare il C ++ sia usare SOLO la propria sintassi (Standard C ++), quindi sarai in grado di usare le cose LANGUAGE e NON il Qt (o qualsiasi altro framework, librerie ... ecc.).

Perché? perché come principiante, quando guardi qualsiasi codice C ++ mescolato con altri codici non C ++ (Qt in questo caso) non sarai in grado di vedere quali sono le cose del C ++ e cosa no, piuttosto sarà un processo più complesso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.