Está aprendendo C ++ através do Qt Framework Realmente aprendendo C ++ [fechado]

32

O problema que tenho é que a maioria dos livros que eu leio em C ++ passa quase sempre na sintaxe e no básico da linguagem, por exemplo , forloops while, matrizes, listas, ponteiros etc.

Mas eles nunca parecem criar algo que seja simples o suficiente para usar no aprendizado, mas prático o suficiente para você entender a filosofia e o poder do idioma.

Então me deparei com QT, que é uma biblioteca incrível!

Mas, trabalhando com as demos que eles têm, parece que agora estou no dilema inverso. Sinto-me como o filho do homem rico dirigindo um carro esportivo subsidiado pelo pai. Como se eu pudesse criar um software fantástico, mas não tenho idéia do que está acontecendo sob o capô.

Como exemplo do meu dilema, tome a tarefa de criar um navegador da web simples. No C ++ puro, eu nem sabia por onde começar, mas com a biblioteca Qt isso pode ser feito dentro de algumas linhas no código.

Não estou reclamando disso. Estou apenas me perguntando como preencher o vazio de conhecimento entre a estrutura básica da linguagem e a interface de alto nível que a estrutura Qt fornece?

user866190
fonte
Eu não estou familiarizado com a programação no Qt. Ele realmente introduz uma nova sintaxe ou altera o idioma, ou são apenas algumas bibliotecas muito sofisticadas?
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner Não QT é a GUI Framework qt.nokia.com Se você estiver interessado
Karlson
O Qt também oferece uma alternativa para classes e contêineres padrão (por exemplo, QString, QList etc.) e muitas outras facilidades. Algumas delas eu acho ainda mais intuitivas que as padrão. Eu acho que é um bom ambiente de programação, mas eu recomendaria aprender a linguagem C ++ principal separadamente.
Giorgio
3
Se você quiser aprender como o Qt é implementado, basta baixar e ver o código fonte.
user16764
1
O @Karlson Qt adiciona algumas coisas à linguagem, daí a necessidade do compilador moc aka metaobject. Isso adiciona alguma reflexão e forma a base do sistema de sinais / slots do Qt.
Tamás Szelei

Respostas:

11

Deseja saber como pisar no acelerador faz o carro andar mais rápido ou apenas se importa que pisar no acelerador faz o carro andar mais rápido?

Você está vendo o benefício da programação de caixas pretas, que é uma ótima maneira de projetar um sistema quando todas as caixas funcionarem. Alguém tem que fazer as caixas pretas e, se você quer ser esse cara / garota, precisa saber mais sobre o idioma do que o cara que está usando a caixa.

Existem trabalhos que são bons em cada estilo; portanto, depende de você o que você deseja programar. Na IMO, você estaria prestando um desserviço a si mesmo, se não enviasse um esforço para afastar parte da abstração que o QT está dando a você eventualmente.

Ryathal
fonte
2
"OMI, você estaria prestando um desserviço a si mesmo, se não enviasse um esforço para afastar parte da abstração que o QT está dando a você eventualmente." Seu direito e isso é o pressentimento que tenho
user866190
18

O maior dano que você causará a si mesmo, se você quiser colocar dessa maneira, é que você não aprenderá a usar as estruturas de dados, iteradores, algoritmos e seqüências de dados C ++ padrão. O Qt possui bibliotecas próprias para todos esses fins, e você é forçado a usá-las, em vez de entidades C ++ padrão, porque as APIs do Qt aceitam apenas estruturas de dados próprias.

Alguém poderia argumentar que aprender a usar uma biblioteca de algoritmos depois de dominar outra é uma tarefa trivial. Antes de ir a uma entrevista em que os entrevistadores esperam que você domine C ++, lembre-se de lidar com essa trivialidade com antecedência.

otto
fonte
3
Concordado - O Qt usa um conjunto de ferramentas totalmente diferente do C ++ padrão.
DeadMG
Em nossa empresa, houve um longo debate sobre se devemos usar os contêineres e iteradores padrão ou os Qt e ainda não chegamos a uma solução: acabamos usando os dois, mesmo que não misturemos os dois estilos em um módulo fornecido. Tenho a sensação de que passar do Qt para o padrão é conceitualmente muito fácil, mesmo que demore algum tempo.
Giorgio
9
Eu uso os contêineres e algoritmos padrão dentro dos meus modelos de engenharia - ou seja, minha lógica de negócios. Eu uso contêineres Qt dentro do meu código GUI. Dessa forma, meus modelos de engenharia são protegidos contra alterações no Qt e vice-versa. O Qt tem maneiras de conectar contêineres padrão e seus contêineres.
EMSR
2
Eu não me importo muito com contêineres de qualquer maneira. Eles não são a parte mais útil do STL; algoritmos são muito mais importantes. Devido ao design do STL, seus algoritmos podem funcionar facilmente com outros contêineres, e os contêineres Qt são projetados para trabalhar com algoritmos STL. Vantajoso para as duas partes, realmente.
MSalters
12

Considerando que o Qt possui seu próprio meta-compilador com o qual você precisa processar seus arquivos de origem, é difícil considerar o código do Qt como "apenas C ++".

Mais importante, porém, o estilo de C ++ que o Qt usa e incentiva é algo que, para o resto de nós, foi visto pela última vez por volta de 1995.

Realmente, é uma tentativa de tornar o C ++ o mais parecido com Java possível. Ele perde ou desencoraja todas as coisas incríveis que realmente fazem o C ++ valer a pena hoje . Em vez disso, você está preso a um subconjunto que acima de tudo parece um Java inferior.

Portanto, se o objetivo é aprender C ++, eu diria que não, fique longe do Qt. Talvez dê uma olhada no Boost, se você quiser usar uma biblioteca estabelecida como ponto de partida. O impulso incorpora as práticas consideradas boas hoje .

Mas, honestamente, se você quiser aprender a linguagem C ++ , escolha um bom livro e concentre-se na linguagem .

Escrever um navegador da Web, não importa como você o faça, irá ensiná-lo sobre os navegadores da Web. Não lhe ensinará muito sobre o idioma que você está usando.

O C ++ como idioma não possui uma classe WebBrowser incorporada. Se você ler o padrão C ++, ele não diz nada sobre navegadores. Nem sequer menciona aplicativos GUI.

Isso ocorre porque essas coisas são criadas no topo, fornecidas por bibliotecas como o Qt. C ++, como qualquer linguagem de programação, é sobre lógica, sobre como expressar essa lógica. E sim, isso significa trabalhar com matrizes, ponteiros, loops e todas essas coisas.

Você seria capaz de escrever um navegador da Web usando apenas essas ferramentas internas, com tempo suficiente ? Você saberia como expressar a lógica do programa envolvida? Caso contrário, você precisará gastar mais tempo em loops e indicadores, menos chamadas new QWebKit()e apenas pegando carona nas bibliotecas prontas.

A "filosofia e poder do idioma" está em matrizes, listas e loops, não em navegadores da web.

jalf
fonte
4
Eu nunca disse que eles eram melhores porque são novos . Eles são novos e são melhores. O ponto é que o C ++ como uma linguagem não é muito adequado para essa abordagem semelhante a Java. No C ++, o polimorfismo de herança e tempo de execução é muito trabalhoso, porque praticamente exige que você aloque objetos em heap por todo o lado, o que deu à linguagem sua reputação de vazamento de memória em primeiro lugar, porque é propenso a fatiar erros, porque torna mais difícil copiar objetos. Também é ineficiente, menos extensível e requer um código clichê mais tedioso.
jalf
2
Caramba, o Qt precisa de seu próprio meta-compilador apenas para tornar seu estilo de programação suportável . Isso não lhe diz algo?
jalf
4
Eu não estava defendendo o Qt por si só (eu mesmo vejo muitas limitações). Sua afirmação "o estilo de C ++ que o Qt usa e incentiva é algo que, para o resto de nós, foi visto pela última vez por volta de 1995". Com esta formulação, não está claro o que é ruim com esse estilo (exceto os 15 anos) e quais são as melhores alternativas atuais. Talvez se você for mais específico, o que você quer dizer se tornará mais claro.
Giorgio
3
@ JimInTexas: também é anterior a C ++. Seu ponto? No início dos anos 90, o C ++ era uma fera muito diferente. Estava muito mais próximo do que acabou se tornando Java do que é hoje.
jalf
3
@JimInTexas: Sim, está errado, mas espero também que seja bem claro o que quero dizer. É uma tentativa de atingir os objetivos de design do Java, em C ++. É uma tentativa de implementar o mesmo modelo de OOP defeituoso que o java implementa.
jalf
9

Está aprendendo C ++ através do Qt Framework realmente aprendendo C ++

Talvez.

Eu precisaria ver o código que você está colocando nos seus manipuladores de eventos.

Realmente, porém, não fique obcecado com o quanto você "sabe". Todos nós usamos estruturas de janelas e ainda estamos aprendendo. Continue codificando / lendo coisas novas e você continuará aprendendo C ++. Aprender uma nova estrutura de janelas é um ótimo complemento para suas habilidades, mesmo que isso não signifique que você possa implementar uma rede neural ou uma classificação rápida em C ++.

Brian
fonte
5

Não se preocupe; em primeiro lugar a maioria de seu código só vai usar a estrutura, mas depois de um tempo você vai ter que estender -lo, mesmo que apenas um pouco. Então você terá que usar mais e mais C ++.

Lembre-se também de que você tem toda a fonte do Qt disponível, o IDE o levará felizmente à definição de qualquer função / método / classe que você desejar. Quanto mais fundo você for, mais C ++ verá.

Outros mencionaram sobre a diferença entre Qt C ++ e C ++ padrão. Estes caem em dois campos:

  • biblioteca diferente: Qt inclui todos os contêineres usuais: matrizes, listas, conjuntos, hashmaps etc. Eles se encaixam muito bem e são boas implementações, mas não são da variedade STD. Ainda assim, nas versões recentes (4.1 e posterior, eu acho), eles têm APIs 'semelhantes a STD', além da variedade antiga (e uma API semelhante a Java). No final, as opções de design (quando usar uma matriz, quando usar um hashmap) são as mesmas, portanto, mudar para STD para projetos não Qt não é tão difícil.

  • mocadições de sintaxe: principalmente para manipulação de sinal, mas também algumas construções de loop mais agradáveis. Muitas pessoas acham que essa ferramenta significa que não é mais C ++; mas IMHO, eles parecem macros um pouco mais inteligentes. Um bom manuseio de sinal com pouca acoplagem é uma enorme vantagem de uma boa estrutura, e é notoriamente difícil de fazer em uma linguagem de tipo estático. No C ++ moderno, é possível com uma grande dose de modelos; mas isso estava longe do padrão quando o Qt chegou pela primeira vez moc. No final, se mais tarde você quiser fazer projetos que não sejam Qt, verifique primeiro se você está usando alguma estrutura e se ela possui sinais. Se sim, então a maior parte do que você está acostumado a fazer com o Qt se aplicará, portanto, não há 'mal' em aprender o Qt primeiro.

Javier
fonte
Quais melhorias de loop são fornecidas por moc?
Basile Starynkevitch
@ Basile Starynkevitch: Talvez ele se refira ao loop foreach (que eu uso muito). Esta é uma adição de sintaxe, mas, ASAIK, isso não tem nada a ver com moc. Então você está certo que talvez a resposta deva ser formulada de uma maneira diferente.
Giorgio
foreaché apenas uma macro .... (na verdade, um "alias" para Q_FOREACHdefinido em <Qt/qglobal.h>). Eu não acho que mocestá processando isso. E C ++ 11 tem a for (auto it : container)construção!
Basile Starynkevitch
@Basile Starynkevitch: Provavelmente, o Qt precisaria de uma profunda reengenharia se tivesse que mudar para o C ++ 11: O Qt foi projetado para C ++ (e também tentou superar algumas de suas limitações), portanto, algumas de suas soluções não são necessárias com o C ++ 11.
Giorgio
1
Eu uso o Qt e o Boost. Há muita sobreposição entre as duas bibliotecas, mas o Qt é muito mais fácil de aprender.
Jim No Texas
4

O Qt é amplamente utilizado no mundo comercial porque fornece um conjunto completo de ferramentas de plataforma cruzada e um ambiente de desenvolvimento, incluindo uma boa biblioteca de GUI.

Também suporta totalmente a internacionalização, incluindo a excelente ferramenta 'Linguista'.

Se você planeja uma carreira acadêmica, eu não me importaria com o Qt. Se, por outro lado, você gosta de C ++ e deseja aprender uma habilidade comercializável, vale a pena aprender o Qt.

E sim, Qt é C ++, e você pode misturar as bibliotecas padrão e aumentar o conteúdo do seu coração, se isso faz você se sentir melhor.

Jim In Texas
fonte
3

É uma má idéia aprender C ++ através do Qt. Primeiro, você precisa aprender os conceitos de linguagem, independentemente de qualquer estrutura, e é isso que os livros em c ++ ensinarão a você e eles estão certos. Basicamente, 'for e loops while, matrizes, listas, ponteiros' são o que são as linguagens de programação. Funcionalidades adicionais são fornecidas por estruturas. Depois de aprender uma linguagem de programação, você pode aprender qualquer estrutura, como Qt ou MFC, criada usando a linguagem, para que os aplicativos possam ser desenvolvidos rapidamente. Com relação ao Qt, depois de aprender c ++, é uma excelente estrutura que o torna tão produtivo quanto qualquer desenvolvedor Java ou .Net. Em breve, você poderá desenvolver aplicativos iOS e Android usando o Qt.

Jaak
fonte
2

Bem, acho que a melhor maneira de aprender C ++ é SOMENTE usando sua própria sintaxe (C ++ padrão), para que você possa usar o material LANGUAGE e NÃO o Qt (ou quaisquer outros frameworks, bibliotecas ... etc.).

Por quê? porque, como iniciante, quando você olha para qualquer código C ++ misturado com outro código que não seja C ++ (Qt neste caso), não poderá ver o que é o que é do C ++ e o que não é, pelo contrário, será um processo mais complexo.

CVist
fonte