みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C++の勉強方法

お世話になります。whatpyonと申します。
最近C++を習得しようと思って勉強を始めているところですが、正直勉強方法に悩んでいます。
(同じような質問を投稿されていた方のレスも拝見させていただきました。)
最終的には、趣味プログラミングで終わらせるつもりはないです。

<最終的な目標>
『MFCを使ってダイアログベースのアプリケーションを作成する』
 ※DBへのアクセス処理も含む。

<期間>
3ヶ月(目安)

プログラム経験は、VB、Javaを1ヶ月程度(所詮付け焼刃の知識しかないですが)しかなく、ほぼ初心者です。
初心者が理解できるようなMFCの書籍を購入して取り組んでいるのですが、書籍で書いている通りのプログラムは組めますが、本質を理解できていないためか、応用を利かせることができません。

また、クラスをどのように分割すれば一番効率的なのかといったこともまったくわかりません。

ここは、まず1ヶ月程度みっちりC++の基本文法、クラスの設計方法等の習得に注力すべきなのでしょうか?

投稿日時 - 2006-09-19 00:02:33

QNo.2416204

困ってます

質問者が選んだベストアンサー

> MFCは、初心者向けではないんですね。

そう思います。
本質的に初心者向きじゃないのに、一見簡単な幻想を与えるところがまた危険というか。
ちょっと使い出すと、結局Win32とC++の知識がないと扱いきれないことに気づくと思います。
# 気づかない人は…いずれ痛い目を見るわけですが、そのときに迷惑をこうむるのは本人だけとは限らず。

> イメージ的には、Win32APIを使いやすく包括したものがMFCだと思っていたので、
> そちらのほうが簡単なのかと思っていました。

大まかなイメージはあってますが、"すでにWin32を知っていて、C++をそこそこ知っている人に対して"、多少使いやすく包括したもの、という方が妥当かなと私は思います。
ちょっとしたサンプル以上のことをしようと思うと、
結局Win32の知識とか、MFCの内部動作に関する知識がものをいいます。
# 本来的には、そういうことを知らなくても使えるのがクラスの理想なのですが、残念ながらMFCはそうではありません。
こういうときにMFCから始めた人は手が出なくなることも多く(もちろん全員とはいいませんし、線のいい人もいますが)、つぶしが利かないことが多々あります。

Win32の全体像ではなく、MFCからこぼれた部分だけやっつけても高が知れてしまう。

# 多分、もっと安全で簡単な開発はVB推奨とかだったと思います>当時のMicrosoft

> 良書と呼ばれる本を理解できるまで読んでいったほうがよいのでしょうか?

物事にはステップがありますので、入門書としてまずは「独習C++」でいいと思います。
とはいえ、(できれば入門書と合わせて)まずこのあたりは読んでみてもいいかなと思います。
「Effective C++」「Effective STL」
これらの本は、いずれも「こういうことはなぜ危ないのか」「こうすればいいのか」「こうやれって書いてあったのはこういう理由か」とかが書かれてますので、
入門書の方で理解が進むとだんだん身にしみてくるんじゃないでしょうか。
ということで、できれば早いうちから反芻してみることをお勧めしておきます。
# 他の本は、その後でいいと思います。C++の設計と進化とかは、ある程度わかってから読むと「なぜC++はこんな設計なのか」良くも悪くも理由がわかって面白いし、役に立つと思いますが、それはまた先のお話かと。

投稿日時 - 2006-09-21 02:22:15

お礼

ご回答ありがとうございます。

Cで、まずはポインタ、構造体、キャスト、プリプロセッサくらいは押さえて、『独習C++』に移ろうかなと思ってます。前に、学習したときは、わかったつもりでいたけど、ポインタと参照の区別がはっきりついておらず、実際プログラム組んだらメモリリークばっかり起こしてしまったので。

薦めていただいた本も是非手元に置いて熟読しようと思います。

投稿日時 - 2006-09-22 01:42:27

ANo.6

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

「C++の設計と進化」監修者です。

正直申し上げてビギナが読む本とは言い難い。
おそらく持て余します。

> ここは、まず1ヶ月程度みっちりC++の基本文法、クラスの設計方法等の習得に注力すべきなのでしょうか?

これに同意。

投稿日時 - 2006-09-19 06:33:05

お礼

ご回答ありがとうございます。

「C++の設計と進化」
拝見させていただきましたが、確かに私には難しかったです。知識がほとんどないため、これを読むのは、相当根気がいるなと感じました。


まずは、入門書片手に、ひたすらコマンドラインベースで、C/C++のプログラムを組んでみて、専門的な書籍を読んで理解を深めていこうとおもいます。

投稿日時 - 2006-09-20 23:14:10

ANo.4

> 「C++の設計と進化」(ソフトバンク)はお勧めです。

いい本ですが、入門書ではないので、そのつもりで。
C++の設計者自身の本です。
この本の思想に共感できないとC++を極めるのは難しいかも。
(それはつまり言語の設計思想に共感できないということなので…)
なお、同じ著者の「プログラミング言語C++」もお勧めします。

その後は、定番ですがMayers本「Effective C++」「Effective STL」「More Effective C++」あたり。
他にも「Efficient C++」とか、「C++ Coding Standards」とか、ピアソン・エデュケーションの本は比較的良書が多いです。
ちょっとわかってくると「Modern C++ Design」なんてのも引き出しが広がるかと。

#3の方が書かれている水準できちんとC++をマスターするには、
設計の本とか抜きで、"言語の基礎"として、このくらいは読んでみて欲しいかな。
この水準に満たない職業プログラマもいるのは確かですが、まともにC++で書ける人ってのは、やはりこの程度は読んでて普通だと思います。

逆にいうと、このあたりに手を出さないと付け焼刃を域を出ない可能性が高い。
付け焼刃のC++ってのは極めて危険な存在です。
たとえ話で言えば、Javaがテフロン加工のフライパンならC++は鉄製です。C++を使って綺麗な焼き色をつけるテクニックがないと、焦げ付かせる危険が高いだけの代物です。
別のたとえで言えば、Javaがオートマの乗用車とすると、C++はレーシング仕様です。微妙なアクセル/ブレーキ/クラッチワークができないと、エンストしてまともに動きもしなかったり、最悪は一見動いたように見えてコーナーで滑ってクラッシュしたりします。
その代わり、乗り手次第で、他の車種では実現できないようなパフォーマンスを叩き出せたりするのです。
# この魔力に取り付かれてしまった人も多い>C++屋さん。

ちなみに、この手の技術書は高いです。「C++の設計と進化」で4千円。「プログラミング言語C++」などは7千円。他も3千円程度はします。
読み込むのも大変ですし、読んで試すだけで、簡単に3ヶ月が終わるでしょう。

他のレス等を見られたのであれば、多分コマンドラインを薦められてる回答が少なからずあったと思います。MFCは初心者に向かないってのもあるのでは。
まともにC++をマスターするためにはいつか通る道と思って頑張ってください。
# C++をこのレベルで理解すると、他の言語は比較的簡単に理解できるんじゃないでしょうか。

投稿日時 - 2006-09-19 02:35:20

お礼

ご回答ありがとうございます。

「C++の設計と進化」(ソフトバンク)
「Effective C++」
「Effective STL」
「More Effective C++」
を書店で眺めてみましたが、内容が少し難しく
読み応えがあるなぁ…と感じました。

やはり、少し難しいと思っても、良書と呼ばれる
本を理解できるまで読んでいったほうがよいので
しょうか?

以前、入門書として『独習C++』を購入していたので
もう一回はじめから読み直そうと思ってはいたのですが…。

投稿日時 - 2006-09-20 23:06:32

ANo.3

>>ここは、まず1ヶ月程度みっちりC++の基本文法、クラスの設計方法等の習得に注力すべきなのでしょうか?

C++は、Cをちょっと発展させた程度のものではなく、ソフトウェア開発の研究成果を注ぎ込んだ、高度でプロ向きな言語です。通常はプログラマへの要求レベルが高くなりすぎて、「(わかんなーい!)誰も保守できない」となる可能性のある言語です。

ですので、C++だけでなく、Cの知識は必須ですし、複合/構造化設計の知識も必須と思っています。Cが完全にマスターできていれば、3ヶ月でなんとかなるかもしれませんけどね。
"C++"、つまり「Cに1加える」と書かれているように、まずCをマスターする必要があります。また、"C"の完全理解にはアセンブラの理解が必要だと思っています。

昔、C言語で、"Hello,world!"を表示した方が、「うまくいったよ。で、ネットワークプログラムはどう書けばいいんだ?」と言って、「バカか、おまえは!(100年早い)」
と言われた話を読んだことがあります。小学生が、いきなり微積分の問題をやらないように、まず、算数レベルのCから学んでゆくべきでしょう。その後アセンブラを学習するとして、ここまでて半年か1年かかるかもしれませんね。で、複合/構造化設計やDFDの知識を得て、C++の文法とクラスの設計法、C++でのオブジェクト指向、コーディング上の注意点などの習得に注力すればいいと思います。

なお、C++が本領を発揮するのは、複雑で巨大なシステムにおいてだと思ってます。DBを読んでダイアログ表示する程度では、Cで十分だと思いますよ。もちろん小さなシステムでもC++のメリットは享受できますけどね。

P.S.
「C++の設計と進化」(ソフトバンク)はお勧めです。とりあえず、この本を購入されて、自分の目指すゴールの高さを推察してみてください。

投稿日時 - 2006-09-19 01:40:53

お礼

ご回答ありがとうございます。


やはり、物事を習得するのには、それなりの時間がかかるのですね。当たり前ですけど。

特にC言語は、何でもできる反面、それだけ学ぶのにも時間がかかるという話をよく聞きます。

できれば、1年で実装できるレベルまでもっていきたいなと思っているので、ひたすら勉強してみます。

投稿日時 - 2006-09-20 22:59:32

ANo.2

趣味で終わるつもりはないとのことですので、一応本職として、そのつもりで書きます。

最終的に何がしたいかによりますが、「MFCのダイアログでDB接続」という目標自体がお勧めできません。C++で開発する"旨み"がないので、再考をお勧めします。

まず、MFC自体、"C++としては"あまり設計が綺麗じゃないです。
# 歴史的しがらみが多い、ともいう。
そして、ダイアログベースは、オブジェクト指向とかあまり関係ないことが多いです。

確かに、現在の所はまだMFCは現役ですが、これからを見据えると必ずしも賢い選択とは言いかねます。


画面があればよくて、DBと接続する二層のクライアントを作るような、
業務アプリ的なものを指向しているなら、古くはVB等の方がはるかに楽でしょう。C++で苦労するより、Accessとか、もしくは.NET系の言語の方がよさそうに思います。

逆に、C++を言語として覚えて生かして生きたいということなら、MFCはとりあえず捨てておいた方がいいです。
MFCは、C++とかをわかってる人が、Windows環境で少しでも楽するためのものであって、入門用とはいえません。

今(そして当面)、C++が活躍するのは組み込み分野(携帯電話やらデジタル家電やら)とかの方が強く、Windowsに固執せずに言語としてC++を理解している方が多分お得です。
ゲーム分野などでもC++は強いですが、この際もMFC(特にダイアログ)の知識が役に立つことは少ないでしょう。(たとえWindowsのゲームでも)。
MFCの下にある、Win32の仕組みがわかっている方が余程有用です。
# これがわかってれっば、MFCなんて後付けでも何とかなります。

C++をものにしたいのであれば、コマンドラインでいろいろなものを書いてみるのがお勧めです。
ポインタ操作などは難点と同時に強みでもあります。
templateを書けとまでは言いませんが、STLを使いこなせるように。STLのアルゴリズムを全部使ってみるだけでも、C++の世界が見えてくるのではないかと思います。

クラス設計は、言語とは別物なので、オブジェクト指向設計の本を読んだり、UMLやデザインパターンなどを学んだりして基礎を知り、何かを作ってみてください。

投稿日時 - 2006-09-19 01:20:34

お礼

ご回答ありがとうございます。
専門家のご意見としてありがたく拝見いたしました。

まずは、Cでポインタの操作を覚えていこうと思います。

MFCは、初心者向けではないんですね。
イメージ的には、Win32APIを使いやすく包括したものがMFCだと思っていたので、そちらのほうが簡単なのかと思っていました。

クラス設計は、もう少し時期を置いてから取り組もうかなと思います。

投稿日時 - 2006-09-20 22:54:30

ANo.1

私もプログラミングは初心者ですが、c, java, VB,など、
専門学校で学んでいます。c++ も自分で学習中です。
class についても、とりあえず理解できた程度でまだ
ほとんど使っていないので、アドバイスだと思って
聞いてください。

>プログラム経験は、VB、Javaを1ヶ月程度(所詮付け焼刃の知識しかな
>いですが)しかなく、ほぼ初心者です。
c++ を覚えるなら先に c 言語の方をやってからのほうが
わかりやすいのです。おそらく関数やポインタに
ついてもまだ、知りえていないと思います。
特にポインタについては挫折の話をよく聞きます。
class 自体の習得はそれほど時間は要しません。
なので、基本(c 言語、又はそれに近い java)を先に
class の土台になるまではやったほうがいいです。

投稿日時 - 2006-09-19 00:51:14

お礼

ご回答ありがとうございます。
参考になる意見をありがとうございます。

確かに、ポインタについての知識はほとんどないに等しいです。
C言語から始めて、基礎固めをやっていこうと思います。

投稿日時 - 2006-09-20 22:39:29

あなたにオススメの質問