Qtフレームワークを通じてC ++を学習していますC ++を実際に学習しています[非公開]


32

私が抱えている問題は、私が読んだC ++の本のほとんどは、構文や言語の基本(forループwhile、配列、リスト、ポインターなど)にほぼ永遠に費やしていることです。

しかし、彼らは学習に使用するのに十分シンプルでありながら、言語の哲学と力を理解するのに十分な実用的なものを決して構築しないようです。

それから素晴らしいライブラリーであるQTを見つけました!

しかし、彼らが持っているデモを通して、私は今、逆のジレンマに陥っているようです。金持ちの息子が父親の助成を受けたスポーツカーを走り回っているような気がします。私は素晴らしいソフトウェアを構築できたが、内部で何が起こっているのか見当もつかないように。

私のジレンマの例として、単純なWebブラウザーを構築するタスクを取り上げます。純粋なC ++では、どこから始めればよいのかさえわかりませんが、Qtライブラリを使用すると、コードの数行以内で実行できます。

私はこれについて文句を言っていません。言語の基本構造とQtフレームワークが提供する高レベルのインターフェースとの間の知識の空白を埋める方法を疑問に思っていますか?


私はQtでのプログラミングに慣れていません。実際に新しい構文を導入したり、言語を変更したりしますか、それとも非常に洗練されたライブラリですか?
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner 興味があるなら、GUIフレームワークqt.nokia.comはQTではありません
カールソン

Qtは、標準のクラスとコンテナー(QString、QListなど)やその他の多くの機能の代替手段も提供します。それらのいくつかは、標準のものよりもさらに直感的です。素晴らしいプログラミング環境だと思いますが、コアC ++言語を個別に学習することをお勧めします。
ジョルジオ

3
Qtの実装方法を知りたい場合は、ダウンロードしてソースコードを確認してください。
user16764

1
@Karlson Qtは言語にいくつかのことを追加するため、メタオブジェクトコンパイラであるmocが必要です。これにより、反射が追加され、Qtの信号/スロットシステムの基盤が形成されます。
タマスシェレイ

回答:


11

アクセルを踏むことで車が速くなる方法を知りたいですか、それともアクセルを踏むだけで車が速くなることだけを気にしますか?

ブラックボックスプログラミングには利点があります。これは、すべてのボックスが機能するときにシステムを設計する優れた方法です。誰かがブラックボックスを作成する必要があります。その男/女になりたい場合は、ボックスを使用している男よりも言語について詳しく知る必要があります。

各スタイルには良い仕事があるので、あなたがプログラムしたいことはあなた次第です。IMOは、QTが最終的に与えている抽象化の一部を取り戻す努力をしなかったとしても、自分自身を傷つけることになります。


2
「QOが最終的にあなたに与えている抽象化の一部を取り戻す努力をしなかったとしても、IMOは自分自身を傷つけているでしょう。」あなたの権利とそれは私が持っている
直感です-user866190

18

そのようにしたい場合、あなたが自分に与える最大の損害は、標準のC ++データ構造、イテレータ、アルゴリズム、および文字列の使用をまったく学習しないことです。Qtにはこれらすべての目的のための独自のライブラリがあり、Qt APIは独自のデータ構造しか受け入れないため、標準C ++エンティティの代わりにそれらを使用せざるを得ません。

1つのアルゴリズムライブラリを使用した後、他のアルゴリズムライブラリを使用することを学ぶのは簡単な作業であると考えることができます。インタビュアーがC ++をマスターすることを期待しているインタビューに行く前に、事前にその些細なことに対処するようにしてください。


3
合意-Qtは、標準C ++とはまったく異なるツールセットを使用します。
-DeadMG

私たちの会社では、標準のコンテナとイテレータを使用すべきかQtのものを使用すべきかについて長い議論がありましたが、まだ解決策を考え出すことができませんでした。指定されたモジュール。Qtから標準に移行するのは、少し時間がかかりますが、概念的には非常に簡単だと感じています。
ジョルジオ

9
エンジニアリングモデル内の標準コンテナとアルゴリズム、つまりビジネスロジックを使用します。GUIコード内でQtコンテナーを使用します。このようにして、私のエンジニアリングモデルはQtの変更から保護され、その逆も同様です。Qtには、標準コンテナとそのコンテナを接続する方法があります。
-emsr

2
とにかくコンテナについてはあまり気にしません。それらはSTLの最も有用な部分ではありません。アルゴリズムははるかに重要です。STLの設計により、そのアルゴリズムは他のコンテナーと簡単に連携でき、QtコンテナーはSTLアルゴリズムと連携するように設計されています。本当に勝ちます。
MSalters

12

Qtにはソースファイルを処理する必要のある独自のメタコンパイラがあることを考えると、Qtコードを「単なるC ++」と見なすことは困難です。

しかし、もっと重要なことは、Qtが使用し、推奨しているC ++ のスタイルは、私たちにとっては、1995年頃に最後に見られたものです。

本当に、C ++を可能な限りJavaライクにしようとする試みです。実際にC ++を実際に使用する価値があるすべての驚くべきことを逃したり、落胆させたりします。代わりに、ほとんどすべてが劣ったJavaのように感じるサブセットにロックされています。

したがって、C ++を学習することが目標である場合は、いいえ、Qtに近づかないでください。おそらく、確立されたライブラリを出発点として使用する場合は、代わりにBoostをご覧ください。Boostは、今日良いと考えられているプラ​​クティスを体現しています

しかし、正直なところ、C ++言語を学びたい場合は、優れた教科書を選び、その言語に集中してください

Webブラウザーを書くことは、それをどのように実行しても、せいぜいWebブラウザーについて教えるだけです。使用している言語についてはあまり教えません。

言語としてのC ++には、WebBrowserクラスが組み込まれていません。C++標準を読んで、ブラウザについては何も言われていません。GUIアプリケーションについても言及していません。

それは Qt などのライブラリによって提供されるものが最上位に構築されているためです。C ++は、他のプログラミング言語と同様に、ロジックについて、そのロジックをどのように表現するかについてです。そして、はい、それは配列とポインターとループとそれらすべてのものを扱うことを意味します。

十分な時間があれば、これらの組み込みツールだけを使用してWebブラウザーを作成できますか?関連するプログラムロジックを表現する方法を知っていますか?そうでない場合は、ループとポインターにより多くの時間を費やす必要があり、呼び出しnew QWebKit()を減らし、既製のライブラリーに便乗するだけです。

「言語の哲学と力」は、Webブラウザーではなく、配列、リスト、およびループにあります。


4
彼らが新しいので彼らがより良いと言ったことがありません。彼らは新しく、より良いです。ポイントは、言語としてのC ++は、このJavaのようなアプローチにはあまり適していないということです。C ++では、継承と実行時のポリモーフィズムは苦痛です。なぜなら、オブジェクト全体をヒープ割り当てする必要があるためです。オブジェクトのコピーが難しくなります。また、非効率的で拡張性が低く、退屈な定型コードが必要です。
-jalf

2
ちなみに、Qt はプログラミングスタイルを耐えやすくするために、独自のメタコンパイラが必要です。それはあなたに何かを教えてくれませんか?
-jalf

4
私はQt自体を防御していませんでした(自分でQtに多くの制限を感じています)。あなたの声明「Qtが使用し奨励しているC ++のスタイルは、私たちにとっては、1995年頃に最後に見られたものです。」この定式化では、このスタイル(15歳以外)の何が悪いのか、現在のより良い代替案は何なのかは明確ではありません。もしあなたがより具体的であれば、あなたが意味することはより明確になるでしょう。
ジョルジオ

3
@JimInTexas:C ++よりも前のものです。あなたのポイント?90年代前半から半ばにかけて、C ++はまったく異なる獣でした。最終的にJavaになったものに、今日よりもはるかに近づきました。
-jalf

3
@JimInTexas:はい、それは間違っていますが、うまくいけば私が言っていることをかなり明確にするべきです。これは、C ++でJavaの設計目標を達成しようとする試みです。これは、javaが実装するのと同じ欠陥のある OOPモデルを実装する試みです。
-jalf

9

Qtフレームワークを介してC ++を実際に学習している

多分。

イベントハンドラーに配置するコードを確認する必要があります。

本当に、あなたがどれだけ「知っている」ことに夢中にならないでください。私たちはすべてウィンドウフレームワークを使用しており、まだ学習中です。新しいもののコーディング/読み取りを続けるだけで、C ++の学習を続けることができます。C ++でニューラルネットワークまたはクイックソートを実装できるわけではない場合でも、新しいウィンドウフレームワークを学習することは、スキルの大きな追加になります。


5

心配しないでください。最初はほとんどのコードがフレームワークを使用するだけですが、しばらくすると、少しでもフレームワークを拡張する必要があります。その後、ますます多くのC ++を使用する必要があります。

また、Qtのソース全体が利用可能であることを覚えておいてください。IDEは、必要な関数/メソッド/クラスの定義に喜んで連れて行ってくれます。深く進むほど、C ++が多く表示されます。

他の人は、Qt C ++と標準C ++の違いについて言及しています。これらは2つのキャンプに分類されます。

  • 異なるライブラリ:Qtには、配列、リスト、セット、ハッシュマップなどのすべての通常のコンテナが含まれます。これらは非常にうまく適合し、実装は良好ですが、STDの種類ではありません。それでも、最近のバージョン(4.1以降では、と思う)には、古い種類(およびJavaのようなAPI)に加えて「STDのような」APIがあります。最終的に、設計の選択(配列を使用する場合、ハッシュマップを使用する場合)は同じであるため、非QtプロジェクトのSTDへの変更はそれほど難しくありません。

  • moc構文の追加:主に信号処理用ですが、さらに優れたループ構成もいくつかあります。多くの人が、このツールはもはやC ++ではないことを意味すると感じています。しかし、私見では、彼らはわずかにスマートなマクロのように感じます。優れた緩やかに結合された信号処理は、優れたフレームワークの大きな利点であり、静的型付き言語で行うことは非常に困難です。現代のC ++では、大量のテンプレートで実行可能です。しかし、それはQtが最初に入手したときの標準からはほど遠いものでしたmoc。最後に、後でQt以外のプロジェクトを実行する場合は、最初にフレームワークを使用するかどうか、およびシグナルがあるかどうかを確認します。はいの場合、Qtで行ったことのほとんどが適用されるため、Qtを最初に学習する際に「害」はありません。


ループの改善点は何mocですか?
バジルスタリンケビッチ

@Basile Starynkevitch:たぶん彼はforeachループ(私はよく使っています)を指します。これは構文の追加ですが、ASAIK、これはmocとは関係ありません。したがって、答えは別の方法で定式化されるべきであるというのは正しいことです。
ジョルジオ

foreachは単なるマクロです...(実際にはでQ_FOREACH定義される「エイリアス」です<Qt/qglobal.h>)。私はそれmocがそれを処理しているとは思わない。そして、C ++ 11にはfor (auto it : container)構造があります!
バジルスタリンケビッチ

@Basile Starynkevitch:おそらくQtをC ++ 11に移行する必要がある場合、Qtは深いリエンジニアリングを必要とするでしょう:QtはC ++向けに設計されており(また、その制限の一部を克服しようとしました)、そのためソリューションの一部はCでは不要です++ 11。
ジョルジオ

1
QtとBoostの両方を使用します。2つのライブラリには多くの重複がありますが、Qtの学習ははるかに簡単です。
ジムでテキサス州

4

Qtは、優れたGUIライブラリを含む完全なクロスプラットフォームツールセットと開発環境を提供するため、商用の世界で広く使用されています。

また、優れた「言語学者」ツールを含む国際化も完全にサポートしています。

アカデミックキャリアを計画している場合、私はQtを気にしません。一方、C ++が好きで、市場性のあるスキルを学びたい場合は、Qtを学ぶ価値があります。

はい、QtはC ++であり、標準をミックスして、気分が良くなったらライブラリを心のコンテンツに追加できます。


3

QtでC ++を学ぶのは悪い考えです。最初に、フレームワークに依存しない言語の概念を学習する必要があります。それが、c ++の本が教えてくれることであり、正しいことです。基本的に、「for and loops while、配列、リスト、ポインター」はプログラミング言語のすべてです。追加の機能はフレームワークによって提供されます。プログラミング言語を学習すると、その言語を使用して構築されたQtやMFCなどのフレームワークを学習できるため、アプリケーションを迅速に開発できます。Qtについては、c ++を学習すれば、Javaまたは.Net開発者と同じくらい生産的になる優れたフレームワークです。まもなく、Qtを使用してiOSおよびAndroidアプリを開発できるようになります。


2

さて、C ++を学ぶ最良の方法は、独自の構文のみ(標準C ++)を使用することだと思うので、Qt(または他のフレームワーク、ライブラリなど)ではなくLANGUAGEのものを使用できます。

どうして?初心者として、他の非C ++コード(この場合はQt)と混合したC ++コードを見ると、C ++のものとそうでないものを見ることができず、むしろより複雑なプロセスになるためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.