慣用的なC ++の書き方を学ぶにはどうすればよいですか?


27

私はコンピューターサイエンスの学生であり、その結果、クラスのあるCのより良いバージョンとしてC ++を教えられました。複雑な問題の解決策が必要なときはいつでも車輪の再発明を試みようとしますが、その後しばらくして、何らかの言語機能または標準ライブラリルーチンがそれを可能にしてくれました。

私は自分char**(int*)(someVoidPointer)イディオムに満足していますが、最近、オープンソースプロジェクトに(わずかな)貢献をした後、C ++コードを書くときに考えるべきことではないと感じています。Cとは大きく異なります。

私がオブジェクト指向プログラミングをかなりよく知っていること、そして急な学習曲線で大丈夫であることを考えると、C ++をコーディングしているときにC ++トラックに心を向けるために何を提案しますか?


7
あなたのコメントに基づいて、C ++構文を知っています。それだけです。C ++でコーディングしていません。stackoverflowC ++タグを開始するのに適した場所です。読書リストFAQが含まれています。学ぶための唯一の本当の方法は、コードを書いて、経験豊富なユーザーにコメントしてもらうことです。レビュー用にここにコードを配置できます。良い例
マーティンヨーク

1
@LokiAstariのアドバイス(これに同意します)に加えて、あなたの友人は正しいと思います。AcceleratedC ++を使用して作業することはおそらく良い考えです。あなたはあなたが期待するよりもはるかに少ないスキミングが必要であることがわかると思います-それはあなたの立場にあり、すでにプログラミングを知っていて、主に現代のC ++のイディオムを学ぶ必要がある人を対象としています。
ジェリーコフィン

はい、実際に私は、最初の2つの章を完了したが、ものは、私はすでに知っていたほとんど何があった-私はちょうど出てくるとのために本を書きません作者を理解してくれかかわらず:) superinformativeコメントを@LokiAstari感謝:)、
ヤティサガデ

3
@yatisagade本が数章で言語のメンタリティを教えることを期待しないでください。すでに構文を知っているので、それは非常に退屈かもしれませんが、言語の完全な初心者であるため、C ++の書籍をいくつか読んで、すべてを読んで各演習を行うことをお勧めします。間違った方法で教えられるということは、間違ったことを忘れて権利(またはそのような何か)を学ぶ必要があるので、努力を倍増する必要があることを意味します。
ヤンニス

1
[...]-(int)(someVoidPointer)以前に64ビットビルドをデバッグしたことがありますか?
エドS.

回答:


12

コメントに基づいて、C ++構文を知っています。
C ++でコーディングするのではなく、クラスを持つCと呼ばれることが多いものです。

stackoverflowのC ++タグを開始するのに適した場所です。読書リストFAQが含まれています。

学ぶための唯一の本当の方法は、コードを書いて、経験豊富なユーザーにコメントしてもらうことです。レビュー用にここコード配置できます。良い例

私はすべての「char *」に満足しています

それらの使用を停止し、std :: stringに切り替えます。

および(int)(someVoidPointer)イディオム。

それらの使用を停止します(Cコードとのインターフェースを除く)。ファンクターの概念を使用すると、いくつかの利点が得られます(状態をカプセル化するという考え方を含む)。

しかし最近、OSSプロジェクトに(わずかな)貢献をした後、私はそれがあなたがC ++で考える方法ではないと感じています。Cには独自の場所がありますが、かなり異なります。

はい。CとC ++は言語として分岐しています。実際には同じ構文を使用できますが、良いCコードと見なされるものは、一般に良いC ++コードとは見なされません(またはその逆)。

一部の友人はAccelerated C ++を提案していますが、ここでも型とは何か、クラスとは何か、オーバーロードとは何かを知っています。

あなたは非常に基本的なものを持っています。

OOの概念に精通している(切断された)C ++プログラマは、言語で慣用的なプログラムをどのように書くことができますか。

多くの作業で:-)


これが唯一の方法ではありません。良い本から多くを学ぶことができます。
ディマ

1
@Dima:もちろんです。本から多くを学ぶことができます。しかし、怒りの中で言語を使用したり経験したりするのに勝るものはありません。私はあなたが本からフランス語を学ぶことができると思いますが、フランス語はあなたが流fluentだと考えるだろうとは思いません。
マーティンヨーク

6
私見、最も効率的な学習方法は、本から始めて、物事を行う正しい方法を学び、実際に試してから、誰かにコードを批判してもらうことです。
ディマ

@ディマ:私はそれについて議論はありません。
マーティンヨーク

12

Effective C ++」という本は、多くの興味深いことを教えており、C ++の機能を理解するために役立ちます。効果的なSTLもあります-私はそれを読んでいませんが、STDに慣れていない人にとっては素晴らしい読み物になると確信しています。

学ぶべき重要なことは、あなたはその言語を利用し、絶えず車輪を再発明しないことです。あなたはすでにそれらを作る方法を学んだので、あなた自身(そして他の人も!)でそれを簡単にし、すべての可能性のためにツールを使用してください。

補足として、STDの使用を要求する多くの人々に出くわします。これは単に使用するのと同じくらい悪い考え方ですchar*-時にはそれは正しいツールではなく、他にもたくさんあります。同じ意味で、独自のコンテナークラスを作成することをdiscしないでください。char*最適な場所を使用する場合は、クラス内に安全にラップします。


効果的なシリーズについては知っています(まだ読んでいません)-しかし、ベストプラクティスの問題のためだと思いますか?
ヤティサガデ

3
@yati sagade:いいえ、これらの本は、「C with classes」から本格的なC ++に移行するために必要なものです。
ディマ

なるほど-実際、Accelerated C ++の後にMeyersによる効果的なc ++が並んでいました。
ヤティサガデ

1
@Dima 「この本の目的は、C ++を効果的に使用する方法を示すことです。C++を言語として既に知っており、その使用経験があることを前提としています。ソフトウェアは包括的、保守可能、移植可能、拡張可能、効率的であり、期待どおりに動作する可能性が高い。 "-効果的なC ++。また、読むことを面白くするいくつかの「落とし穴」もカバーしています。
パブ

1
@ディマ:ここで注意してください。第2版はC.ザ・から来る新しいC ++プログラマを目指した(最新)の第3版は、よりJavaの、C#などのような言語から来たプログラマを目指している
SBI

6

Herb Sutterからの最近のBUILDテイクをお勧めします。「現代のC ++コードを書く:C ++が長年にわたってどのように進化してきたか」と呼ばれるもの:

多くの人は、C ++を大学で経験したのと同じ言語、または単に「クラスのあるC」と考えていますが、C ++言語は長年にわたって大きく進化しています。このセッションでは、C ++を使用して、パワーとパフォーマンスのアプリを提供する革新的で表現力豊かで美しいアプリを作成する方法について説明します。新しく完成したC ++ 0x標準が、他の多くの言語と同様にC ++の生産性を高める方法をご覧ください。

悪くないプレゼンテーションであり、長すぎず、最新の標準の新機能への良いポインタがあり、古いC / C ++スタイルを更新するためのヒントを提供します。

それ以外に、STLを学ぶ必要があります-複雑ではなく、Effective STLなどの書籍がたくさんあります。


+1ありがとう。それは素晴らしかった。この質問を聞いてうれしいです。非常に多くの素晴らしいリンク:)
yati sagade

4

Andrew KoenigとBarbara MooによるAccelerated C ++を読んで、10年近くC ++で働いた後、C ++を教えるのを助けました。(実際、その時点でテンプレートのメタプログラミングをいじくり始めていました。)言語についての新しい事実を教えてくれたとは思わないが、それでも啓示であることがわかった。1

しかし、私が教えてくれたのは、C ++を高水準言語として見て使用することでした。生のポインタをいじっdeleteたり、可能な限り標準ライブラリを使用したりします。

これはまさにあなたが望んでいることだと感じています。

1 当時私に教えることは何もなかったわけではありません(10年後の今でもたくさんあります)が、250ページの入門書に絞り込める知識はあまりありません。


1

答える前に-注:慣用的なC ++は動いているターゲットです。言語が変わると、イディオムも変わります。実際、一部の言語機能は、言語自体、または少なくとも標準ライブラリからのサポートにより簡素化または改善される可能性のある慣用的なコードを廃止できるようにすることを目的としています。ですから、どんな情報源も、執筆時点で慣用的あったものについてのみあなたに知らせることができることを心に留めておいてください。

そうは言っても、チェックアウトするとよいでしょう:

codereview.SXサイト

StackExchangeネットワークにはcodereview.stackexchange.comという名前のサイトがあります。クラス、ライブラリの一部、あまり大きくないC ++コードを書いた場合は、そこに投稿して、コミュニティにレビューを依頼できます。コードはコンパイルし、基本的に機能する必要があることに注意してください-そのサイトはデバッグ用ではありません。

また、そこで作業している内容に関連するC ++コードを検索し、レビュアーが強調する内容を確認できます。回答を投稿せずに、投稿されたコードを自分でレビューして、他の人が考えていることを読んでもいいでしょう。

C ++会議ビデオプレゼンテーション

毎年開催されるC ++に焦点を当てたいくつかの開発者会議があります。

そして、それらだけではありません...とにかく、これらのそれぞれは、プレゼンテーションの多く/すべてのビデオを投稿します。これらは、いくつかの慣用的なコーディング、および慣用的なものとすべきでないものを決定できる原則を含む、多くを教えてくれます。

スピーカーのスライドデッキを入手できることもあります。


0

まあ、オープンソースプロジェクトは非常に良いスタートです。あなたの大学のクラスに基づいてプロのプログラマーになることを期待しないでください。彼らはそのためのものではありません(私の答え書いたように)

あなたは構文を知っているようです、それは良いことです。さあ、他の人のコードを読んで、ピアレビューのために自分のコードを投稿してください。コードを読んで理解し、デバッグし、修正すること、そしてもちろん、既にあるコーディング規約を遵守してコードに追加することから、多くのことを学びます。

前述のように、プロフェッショナルな本も非常に良いアイデアです。StackOverflowの質問と回答を参照すると、多くのことを学ぶことができます(確かに多くのことを教えてくれます。


-1

多くの優れたC ++コードを読むことはおそらく役立つでしょう。あなたはそれを感じ始めるためにコードを見なければなりません。繰り返しになりますが、ほとんどのC ++コードは間違っています。


「C ++コードのほとんどが間違っています」-明確にできますか?私は、ほとんどのOSSプロジェクトが実際に高い品質基準を維持していることを見てきました。
ヤティサガデ

1
プロジェクト、はい、しかし、物事のやり方をグーグルで調べると、しばしば悪い例につながります。
コーダー

1
@yati:OSSプロジェクトに関する私の経験は逆です。
SBI

@sbiたぶん-私はMozillaプロジェクトとGoogle Chromeに関与していました(実際にはここには関与していませんが、一種の学習です)。彼らの規律は傑出しています!
ヤティサガデ

@yatisagade:少なくとも、存在するほとんどのC ++コードは、優れたコードを書くために今日不可欠な機能が言語にあったときに書かれたものです。残りのほとんどは、そのような古いコードで動作するように作成されたライブラリを使用するように書かれているため、この新しいコードはある程度それらに適合させる必要があります。そして、すべてこれは...関係なく、コーダーはまともな設計と実装のために必要な時間と労力を投資するかどうかにある
einpoklum -モニカ復活
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.