Está aprendiendo C ++ a través del marco Qt Realmente aprendiendo C ++ [cerrado]

32

El problema que tengo es que la mayoría de los libros de C ++ que leo pasan casi para siempre en la sintaxis y los conceptos básicos del lenguaje, por ejemplo , forbucles while, matrices, listas, punteros, etc.

Pero nunca parecen construir algo que sea lo suficientemente simple como para usarlo para el aprendizaje, pero lo suficientemente práctico como para que comprenda la filosofía y el poder del lenguaje.

Luego me topé con QT, que es una biblioteca increíble.

Pero trabajando a través de las demostraciones que tienen, parece que ahora estoy en el dilema inverso. Me siento como el hijo del rico conduciendo en un auto deportivo subsidiado por el padre. Como si pudiera construir un software fantástico, pero no tengo idea de lo que sucede debajo del capó.

Como ejemplo de mi dilema, tome la tarea de construir un navegador web simple. En C ++ puro, ni siquiera sabría por dónde empezar, pero con la biblioteca Qt se puede hacer dentro de unas pocas líneas en el código.

No me estoy quejando de esto. Me pregunto cómo llenar el vacío de conocimiento entre la estructura básica del lenguaje y la interfaz de alto nivel que proporciona el marco Qt.

user866190
fuente
No estoy familiarizado con la programación en Qt. ¿Presenta realmente una nueva sintaxis o cambia el idioma, o son solo algunas bibliotecas muy sofisticadas?
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner No QT es el marco GUI qt.nokia.com si estás interesado
Karlson
Qt también ofrece una alternativa a las clases y contenedores estándar (por ejemplo, QString, QList, etc.) y muchas otras instalaciones. Algunos de ellos me parecen aún más intuitivos que los estándar. Creo que es un buen entorno de programación, pero recomendaría aprender el lenguaje central C ++ por separado.
Giorgio
3
Si quieres aprender cómo se implementa Qt, solo descarga y mira su código fuente.
user16764
1
@Karlson Qt agrega algunas cosas al lenguaje, de ahí la necesidad del compilador de metaobjetos moc aka. Esto agrega algo de reflexión y forma la base del sistema de señales / ranuras de Qt.
Tamás Szelei

Respuestas:

11

¿Desea saber cómo pisar el acelerador hace que el automóvil vaya más rápido, o solo le importa que pisar el acelerador acelere el automóvil?

Está viendo el beneficio de la programación de caja negra, que es una excelente manera de diseñar un sistema cuando todas las cajas funcionan. Sin embargo, alguien tiene que hacer las cajas negras y si quieres ser ese chico / chica, entonces necesitas saber más sobre el idioma que el chico que usa la caja.

Hay trabajos que son buenos en cada estilo, así que depende de ti lo que quieras programar. En mi opinión, te estarías perjudicando si no te esforzaras por recuperar parte de la abstracción que QT te está dando eventualmente.

Ryathal
fuente
2
"En mi opinión, estarías perjudicándote a ti mismo si no te esforzaras por recuperar parte de la abstracción que QT te está dando". Su derecho y esa es la primera impresión que tengo
user866190
18

El mayor daño que te harás a ti mismo, si quieres decirlo de esa manera, es que no aprenderás a usar las estructuras de datos, iteradores, algoritmos y cadenas estándar de C ++. Qt tiene bibliotecas propias para todos esos fines, y usted está obligado a usarlas en lugar de entidades C ++ estándar porque las API de Qt solo aceptan estructuras de datos propias.

Se podría argumentar que aprender a usar una biblioteca de algoritmos después de dominar otra es una tarea trivial. Antes de ir a una entrevista donde los entrevistadores esperan que domines C ++, asegúrate de lidiar con esa trivialidad de antemano.

otón
fuente
3
De acuerdo: Qt utiliza un conjunto de herramientas completamente diferente al estándar C ++.
DeadMG
En nuestra empresa hubo un largo debate sobre si uno debería usar los contenedores e iteradores estándar o los Qt y aún no hemos encontrado una solución: terminamos usando ambos, aunque no mezclamos los dos estilos en un módulo dado. Tengo la sensación de que pasar de Qt a estándar es conceptualmente muy fácil, aunque llevará algo de tiempo.
Giorgio
9
Utilizo los contenedores y algoritmos estándar dentro de mis modelos de ingeniería, es decir, mi lógica de negocios. Yo uso contenedores Qt dentro de mi código GUI. De esta manera, mis modelos de ingeniería están protegidos contra cambios en Qt y viceversa. Qt tiene formas de conectar contenedores estándar y sus contenedores.
Emsr
2
De todos modos, no me importan mucho los contenedores. No son la parte más útil de la STL; Los algoritmos son mucho más importantes. Debido al diseño de STL, sus algoritmos pueden funcionar fácilmente con otros contenedores, y los contenedores Qt están diseñados para funcionar con algoritmos STL. Ganar-ganar, de verdad.
MSalters
12

Teniendo en cuenta que Qt tiene su propio metacompilador con el que tiene que procesar sus archivos fuente, es difícil considerar que el código Qt sea "solo C ++".

Pero lo más importante, el estilo de C ++ que Qt usa y fomenta es algo que, para el resto de nosotros, se vio por última vez alrededor de 1995.

Realmente, es un intento de hacer que C ++ sea lo más parecido a Java posible. Se pierde, o desalienta, todas las cosas increíbles que realmente hacen que valga la pena usar C ++ hoy en día . En cambio, estás encerrado en un subconjunto que, sobre todo, se siente como un Java inferior.

Entonces, si el objetivo es aprender C ++, diría que no, manténgase alejado de Qt. Tal vez eche un vistazo a Boost en su lugar, si desea utilizar una biblioteca establecida como punto de partida. Boost encarna las prácticas que hoy se consideran buenas .

Pero, sinceramente, si quieres aprender el lenguaje C ++ , elige un buen libro de texto y enfócate en el lenguaje .

Escribir un navegador web, sin importar cómo lo haga, en el mejor de los casos le enseñará sobre los navegadores web. No te enseñará mucho sobre el lenguaje que estás usando.

C ++ como lenguaje no tiene una clase WebBrowser incorporada. Si lee el estándar C ++, no dice nada sobre los navegadores. Ni siquiera menciona las aplicaciones GUI.

Eso es porque esas cosas están construidas en la parte superior, proporcionadas por bibliotecas como Qt. C ++, como cualquier lenguaje de programación, trata sobre lógica, sobre cómo expresar esa lógica. Y sí, eso significa trabajar con matrices, punteros, bucles y todas esas cosas.

¿Sería capaz de escribir un navegador web utilizando solo esas herramientas integradas, con el tiempo suficiente ? ¿Sabrías cómo expresar la lógica del programa involucrado? Si no, entonces necesita pasar más tiempo en bucles y punteros, y menos llamadas new QWebKit()y simplemente aprovechando bibliotecas prefabricadas.

La "filosofía y poder del lenguaje" se encuentra en las matrices, listas y bucles, no en los navegadores web.

jalf
fuente
44
Nunca dije que fueran mejores porque son nuevos . Son nuevos y son mejores. El punto es que C ++ como lenguaje simplemente no es muy adecuado para este enfoque similar a Java. En C ++, el polimorfismo de herencia y tiempo de ejecución es una molestia, ya que prácticamente requiere que se apilen objetos en todo el lugar, que es lo que le dio al lenguaje su reputación de pérdida de memoria en primer lugar, porque es propenso a cortar errores, porque hace que copiar objetos sea más difícil. También es ineficiente, menos extensible y requiere un código repetitivo más tedioso.
jalf
2
Diablos, Qt necesita su propio metacompilador solo para hacer soportable su estilo de programación . ¿Eso no te dice algo?
jalf
44
No estaba defendiendo Qt en sí mismo (veo muchas limitaciones en mí mismo). Su afirmación "el estilo de C ++ que Qt usa y fomenta es algo que, para el resto de nosotros, se vio por última vez alrededor de 1995". Con esta formulación no está claro qué tiene de malo este estilo (aparte de que tiene 15 años) y cuáles son las mejores alternativas actuales. Quizás si eres más específico, lo que quieres decir se volverá más claro.
Giorgio el
3
@JimInTexas: también es anterior a C ++. ¿Tu punto? A principios de mediados de los 90, C ++ era una bestia muy diferente. Estaba mucho más cerca de lo que finalmente se convirtió en Java de lo que es hoy.
jalf
3
@ JimimTexas: Sí, está mal, pero también debería ser bastante claro lo que quiero decir. Es un intento de lograr los objetivos de diseño de Java, en C ++. Es un intento de implementar el mismo modelo defectuoso de OOP que implementa Java.
jalf
9

Está aprendiendo C ++ a través del marco Qt Realmente aprendiendo C ++

Tal vez.

Tendría que ver el código que está poniendo en sus controladores de eventos.

Realmente, no te obsesiones con cuánto "sabes". Todos usamos marcos de ventanas y todos seguimos aprendiendo. Simplemente siga codificando / leyendo cosas nuevas y continuará aprendiendo C ++. Aprender un nuevo marco de ventanas es una gran adición a sus habilidades, incluso si no significa que puede implementar una red neuronal o una selección rápida en C ++.

brian
fuente
5

No te preocupes Al principio, la mayoría de su código solo usará el marco, pero después de un tiempo tendrá que extenderlo , aunque sea un poco. Entonces tendrás que usar más y más de C ++.

También recuerde que tiene toda la fuente de Qt disponible, el IDE lo llevará felizmente a la definición de cualquier función / método / clase que desee. Cuanto más profundices, más C ++ verás.

Otros han mencionado sobre la diferencia entre Qt C ++ y C ++ estándar. Estos caen en dos campos:

  • biblioteca diferente: Qt incluye todos los contenedores habituales: matrices, listas, conjuntos, hashmaps, etc. Se ajustan muy bien y son buenas implementaciones, pero no son la variedad STD. Aún así, en versiones recientes (4.1 y posteriores, creo) tienen API 'STD-like' además de la variedad anterior (y una API similar a Java). Al final, las opciones de diseño (cuándo usar una matriz, cuándo usar un mapa hash) son las mismas, por lo que cambiar a STD para proyectos que no son Qt no es tan difícil.

  • mocadiciones de sintaxis: principalmente para el manejo de señales, pero también un par de construcciones de bucles más agradables Mucha gente siente que esta herramienta significa que ya no es C ++; pero en mi humilde opinión, se sienten como macros un poco más inteligentes. Un buen manejo de la señal acoplada libremente es una gran ventaja de un buen marco, y es notoriamente difícil de hacer en un lenguaje de tipo estático. En C ++ moderno, es factible con una gran dosis de plantillas; pero eso estaba lejos de ser estándar cuando Qt llegó por primera vez moc. Al final, si luego desea hacer proyectos que no sean Qt, primero verifique si usará algún marco y si tiene señales. En caso afirmativo, se aplicará la mayor parte de lo que está acostumbrado a hacer con Qt, por lo que no hay ningún "daño" en aprender Qt primero.

Javier
fuente
¿Qué mejoras de bucle están dadas por moc?
Basile Starynkevitch
@Basile Starynkevitch: Tal vez se refiere al bucle foreach (que uso mucho). Esta es una adición de sintaxis pero, ASAIK, esto no tiene nada que ver con moc. Entonces tiene razón en que tal vez la respuesta debería formularse de una manera diferente.
Giorgio el
foreaches solo una macro ... (en realidad un "alias" para Q_FOREACHdefinir en <Qt/qglobal.h>). No creo que eso lo mocesté procesando. ¡Y C ++ 11 tiene la for (auto it : container)construcción!
Basile Starynkevitch
@Basile Starynkevitch: Probablemente Qt necesitaría una profunda reingeniería si tuviera que pasar a C ++ 11: Qt fue diseñado para C ++ (y también trató de superar algunas de sus limitaciones), por lo tanto, algunas de sus soluciones no son necesarias con C ++ 11.
Giorgio
1
Yo uso Qt y Boost. Hay mucha superposición entre las dos bibliotecas, pero Qt es mucho más fácil de aprender.
Jim en Texas
4

Qt es ampliamente utilizado en el mundo comercial porque proporciona un conjunto completo de herramientas multiplataforma y un entorno de desarrollo, que incluye una buena biblioteca GUI.

También es totalmente compatible con la internacionalización, incluida la excelente herramienta 'Linguist'.

Si planeas una carrera académica, entonces no me molestaría con Qt. Si, por otro lado, te gusta C ++ y quieres aprender una habilidad comercializable, entonces vale la pena aprender Qt.

Y sí, Qt es C ++, y puede mezclar el estándar y aumentar las bibliotecas al contenido de su corazón si eso lo hace sentir mejor.

Jim en Texas
fuente
3

Es una mala idea aprender C ++ a través de Qt. Primero tienes que aprender los conceptos del lenguaje independientemente de cualquier marco y eso es lo que los libros de C ++ te enseñarán y tienen razón. Básicamente, 'for y bucles while, matrices, listas, punteros' son de lo que se tratan los lenguajes de programación. Las funcionalidades adicionales son proporcionadas por los marcos. Una vez que aprende un lenguaje de programación, puede aprender cualquier marco como Qt o MFC que se construye utilizando el lenguaje, para que las aplicaciones se puedan desarrollar rápidamente. Con respecto a Qt, una vez que aprende c ++, es un marco excelente que lo hace tan productivo como cualquier desarrollador de Java o .Net. En breve podrás desarrollar aplicaciones iOS y Android usando Qt.

Jaak
fuente
2

Bueno, creo que la mejor manera de aprender C ++ es utilizando su propia sintaxis SOLAMENTE (Estándar C ++), por lo que podrá usar el material de IDIOMA, y NO el Qt (o cualquier otro marco, biblioteca ... etc.).

¿Por qué? porque, como principiante, cuando observa cualquier código C ++ mezclado con otro código que no sea C ++ (Qt en este caso) no podrá ver qué es lo que C ++ es y qué no, sino que será un proceso más complejo.

CVist
fuente