タグ付けされた質問 「c++」

静的に型付けされた自由形式のマルチパラダイムでコンパイルされた汎用プログラミング言語であるC ++に関する質問。

5
トップダウンまたはボトムアップのどちらを設計するのが望ましいですか?
私が理解しているように、トップダウン設計は、最小の構成要素が定義されるまで、抽象的な高レベルの概念をより小さなコンクリートのわかりやすい部品に改良することです。一方、ボトムアップは低レベルのパーツを定義し、システム全体が形成されるまで徐々に高レベルのブロックを構築します。 実際には、2つの方法を組み合わせることをお勧めします。ドメインの知識、その関係、および制約を完全に指定するために、高レベルの仕様から始めます。問題が十分に理解されると、最小の構成要素が作成されてシステムが構築されます。 のプロセス: 要件仕様の作成 設計仕様を作成します(図を使用) 実装する 届ける 繰り返します(反復開発では、各フェーズでチャンク全体を行うのではなく、少しずつ繰り返し行い、顧客の動的な要件に適応するために毎日ミーティングを行います) 私には完全に正常に見えます(仕様としての計画)。それには欠点がありますが、それが反復開発を行った理由です:1つのフェーズに時間を費やす代わりに、変更(場合によっては毎日)を受けるドメイン知識のあらゆる可能性を調査するための要件分析ではなく、少し分析します、少し設計してから実装します。 別の方法は、各反復がミニウォーターフォール形式であり、分析が数日(または1週間)で行われることです。同じことが設計にも当てはまります。残りの時間は実装に費やされます。反復的な開発と組み合わせたトップダウンアプローチには本質的に何か問題がありますか? 彼のエッセイであるプログラミングボトムアップでは、ポール・グラハムは完全にボトムアップからビルドを奨励するか、ボトムアップからプログラムするように思われますが、要件分析/設計段階ではありません。 経験豊富なLispプログラマーは、プログラムを異なる方法で分割します。トップダウン設計と同様に、彼らはボトムアップ設計と呼ばれる原則に従います-問題に合うように言語を変更します。 私が知る限り、彼が意味したのは、Lisperがまだトップダウン設計を実行しているが、プログラムはボトムアップであるということです。彼が書いた別のポイント: ボトムアップ設計とは、同じプログラムを異なる順序で書くだけではないことを強調する価値があります。ボトムアップで作業すると、通常は別のプログラムになります。単一のモノリシックプログラムの代わりに、より抽象的な演算子を備えたより大きな言語と、その中に記述されたより小さなプログラムを取得します。まぐさの代わりに、アーチを取得します。 これは、Lispでプログラムを作成している間に、一般的なツールになるということですか?
31 design  c++  lisp 

4
「void *」がC ++で暗黙的にキャストされないのはなぜですか?
Cでは、void *他のポインター型にキャストする必要はなく、常に安全に昇格されます。ただし、C ++では、そうではありません。例えば、 int *a = malloc(sizeof(int)); Cでは動作しますが、C ++では動作しません。(注:私はあなたがmallocC ++で、またはその点newで使用すべきではないことを知っています、代わりにスマートポインタおよび/またはSTLを好む必要があります;これは純粋に好奇心から尋ねられます)C ++標準はこの暗黙的なキャストを許可しないのはなぜですか、 C標準はそうですか?


7
C ++プログラムはすべての例外をキャッチし、例外が過去のmain()でバブリングするのを防ぎますか?
私はかつて、C ++プログラムが最終的にすべての例外をキャッチする必要があるとアドバイスされました。当時与えられた理由は、本質的に、例外がmain()奇妙なゾンビ状態に入る以外にバブルするプログラムです。これは数年前に話されましたが、振り返ってみると、観察された現象は、問題のプロジェクトからの非常に大きなコアダンプの長期にわたる生成によるものだと思います。 当時、これは奇妙だが説得力があるように思われた。C ++がすべての例外をキャッチしていないことをプログラマに「罰」するのはまったく無意味でしたが、私の前の証拠がこれを裏付けているようです。問題のプロジェクトでは、キャッチされていない例外をスローしたプログラムは奇妙なゾンビ状態に入ったように見えます-または、私が原因だと思うように、不要なコアダンプの中でのプロセスを停止するのは異常に困難です。 (なぜこれが当時より明白ではなかったのか疑問に思う人のために:プロジェクトは複数のプロセスから複数のファイルに大量の出力を生成し、あらゆる種類のaborted (core dumped)メッセージを事実上不明瞭にしました。プログラムの問題は通常、長期間のプログラムによって長時間にわたって多くのイベントから蓄積された状態に依存するのではなく、短期間のプログラムへの初期入力に依存していませんでした(< 1時間)したがって、デバッグビルドまたはデバッガーからの同じ入力でプログラムを再実行するだけで、より詳細な情報を取得することがより実用的でした。) 現在、例外を残すことを防ぐためだけに例外をキャッチすることの大きな利点または欠点があるかどうかはわかりませんmain()。 例外が過去に発生することを許可することで考えられる小さな利点main()は、結果がstd::exception::what()端末に出力されることです(少なくともLinuxでgccコンパイルされたプログラムの場合)。一方、これは代わりに、すべての例外をキャッチすることによって達成することは簡単ですから派生std::exceptionし、その結果を印刷std::exception::what()し、それが由来していない例外からのメッセージ印刷することが望ましいならstd::exception、それはその後、しなければならない出発前にキャッチされmain()、印刷するためにはメッセージ。 過去に例外が発生することを許可することで考えられるささいな欠点main()は、不要なコアダンプが生成される可能性があることです。大量のメモリを使用するプロセスの場合、これは非常に厄介であり、プログラムからコアダンプ動作を制御するにはOS固有の関数呼び出しが必要です。一方、コアダンプと終了が必要な場合は、代わりにを呼び出すstd::abort()ことでいつでも達成でき、コアダンプなしの終了はを呼び出すことでいつでも達成できますstd::exit()。 逸話的に、what(): ...クラッシュ時に広く配布されているプログラムによって出力されるデフォルトのメッセージを見たことはありません。 C ++例外が過去にバブルアップすることを許可または拒否する強力な議論は、もしあれば、何main()ですか? 編集:このサイトには、一般的な例外処理に関する質問がたくさんあります。私の質問は、特に処理できないC ++の例外に関するものでmain()、エラーメッセージが出力される可能性はありますが、すぐにエラーが表示されることがあります。
29 c++  exceptions 

10
ポインター変数の使用はメモリのオーバーヘッドではありませんか?
CやC ++などの言語では、変数へのポインターを使用しているときに、そのアドレスを格納するためにもう1つのメモリの場所が必要です。これはメモリのオーバーヘッドではありませんか?これはどのように補償されますか?ポインターは、タイムクリティカルな低メモリアプリケーションで使用されていますか?
29 c++  c  pointers 

5
C ++のスタイルガイド[終了]
現在、C ++コードでGoogle C ++スタイルガイドを使用していますが、非常に満足しています。 最近、このガイドは非常に悪いと言われました。Googleが内部で使用していることは知っていましたが、時代遅れであり、非常に悪い習慣を助長しています。そこで、別のコーディングスタイルを使用したいと思います。 どのような優れた、かなり使用されているC ++スタイルガイドがありますか?私はgccとVisual Studioの両方のコードを記述し、多くのC ++ 11機能を使用しています。 Google C ++ Style Guideで非常に気に入ったのは、インデント、空白、および命名規則(特に、すべてのクラス、タイプ-typedef、タイプエイリアス、テンプレートエイリアスを含む-最初の文字が大文字)です。 私は答えが主観的であることを知っており(このサイトでこれがOKであることを願っています)、どんな意見も感謝しますが、最近使用されているガイドは興味があります。

3
なぜC ++のブール型は++をサポートしているのに-ではないのですか?
なぜ演算子--はboolには存在しないのに、演算子には存在しないの++ですか? C ++で試しましたが、質問が他の言語に当てはまるかどうかわかりません。私も知りたいです。 私は知っている、私は++ブールで演算子を使用することができます。boolをtrueに等しくします。 bool b = false; b++; // Now b == true. --反対の方法で演算子を使用できないのはなぜですか? bool b = true; b--; // Now b == false; あまり便利ではありませんが、興味があります。

6
Googleでのプログラミング言語の使用[終了]
GoogleはPython、Java、C ++を使用していると聞きました。しかし、私が知らないのは、これらのプログラミング言語のそれぞれがどのように使用されているかです。Googleで使用されているPython、Java、C ++は何ですか。1つの言語で十分なのに、なぜ最大3つのプログラミング言語を使用したのでしょうか。誰か知っていますか?

4
#ifdefを使用して、開発中に異なるタイプの動作を切り替える
開発中に#ifdefを使用して、さまざまな種類の動作を切り替えることをお勧めしますか?たとえば、既存のコードの動作を変更したい場合、動作を変更する方法がいくつかあります。異なるアプローチをテストおよび比較するには、異なる実装を切り替える必要があります。通常、コードの変更は複雑で、異なるファイルの異なるメソッドに影響を及ぼします。 私は通常いくつかの識別子を導入し、そのようなことをします void foo() { doSomething1(); #ifdef APPROACH1 foo_approach1(); #endif doSomething2(); #ifdef APPROACH2 foo_approach2(); #endif } void bar() { doSomething3(); #ifndef APPROACH3 doSomething4(); #endif doSomething5(); #ifdef APPROACH2 bar_approach2(); #endif } int main() { foo(); bar(); return 0; } これにより、さまざまなアプローチをすばやく切り替えて、ソースコードの1つのコピーだけですべてを実行できます。開発のための良いアプローチですか、それともより良いプラクティスがありますか?

6
ミューテックスがロックされているかどうかを確認できないのはなぜですか?
C ++ 14は、std::mutexがロックされているかどうかをチェックするメカニズムを省略しているようです。このSOの質問を参照してください。 https://stackoverflow.com/questions/21892934/how-to-assert-if-a-stdmutex-is-locked これを回避するには、いくつかの方法があります。 std::mutex::try_lock() std::unique_lock::owns_lock() しかし、これらのどちらも特に満足のいく解決策ではありません。 try_lock()現在のスレッドがミューテックスをロックしている場合、false negativeを返すことが許可され、未定義の動作があります。また、副作用もあります。オリジナルの上のowns_lock()建設を必要とします。unique_lockstd::mutex 明らかに、自分でロールバックすることもできますが、現在のインターフェースの動機を理解したいです。 ミューテックスのステータスをチェックする機能(std::mutex::is_locked())は、私には難解な要求とは思えないので、標準委員会は見落としではなく意図的にこの機能を省略していると思います。 どうして? 編集:わかりましたので、多分このユースケースは私が期待していたほど一般的ではないので、特定のシナリオを説明します。複数のスレッドに分散された機械学習アルゴリズムがあります。各スレッドは非同期で動作し、最適化の問題が完了するとマスタープールに戻ります。 次に、マスターミューテックスをロックします。次に、スレッドは子孫を変異させる新しい親を選択する必要がありますが、現在他のスレッドによって最適化されている子孫を持たない親からのみ選択できます。したがって、現在別のスレッドによってロックされていない親を見つけるために検索を実行する必要があります。マスタースレッドミューテックスがロックされているため、検索中にミューテックスのステータスが変更されるリスクはありません。明らかに他の解決策もありますが(私は現在ブール値のフラグを使用しています)、mutexはスレッド間同期の目的で存在するこの問題に対する論理的な解決策を提供すると考えました。
28 c++ 

3
ガベージコレクターを除き、Javaを非リアルタイムプログラミング言語にするもの
ガベージコレクタを除き、リアルタイムプログラミングに適さないJavaのその他の機能は何ですか?ネット上では、Java vs C ++がリアルタイムプログラミングに関して議論されるときはいつでも、言及されるのは常にガベージコレクターです。他に何かありますか?

7
CスキルよりもC ++スキルが高いですか?[閉まっている]
よく見られるC / C ++は、CVでのスキルを実際には説明していないように感じます。それで、私はそれを高度なC ++知識と平凡なCスキルに分けることを計画しています。 これは読者を混乱させると思いますか?「CはC ++のサブセットです。だから、この男は私に電話をかけようとしているのでしょうか?」まあ、私が伝えようとしているのは、私が趣味だけの純粋なCプロジェクトである間に、私はいくつかの現実世界のC ++プロジェクトをしました。熟練したC ++プログラマーが必ずしも資格のあるCの人ではないことに同意しますか、またはこの切り替えは簡単に行われると思いますか?
28 c++  c  skills 

10
CとC ++を知っているのに、なぜC ++ 11を学ぶのですか?[閉まっている]
私はCとC ++のプログラマーですが、どちらの言語にも固執せず、2つの混合物を作成します。場合によっては、演算子のオーバーロードやテンプレートを使用したクラス内のコードを使用することもありますが、非常に優れたSTLは明らかに優れた方法です。単純なC関数ポインターを使用すると、はるかに読みやすく、明確になる場合があります。だから、私は両方の言語に美しさと実用性を見出しています。「それらを混ぜてC ++コンパイラでコンパイルすれば、それはもはや混同ではなく、すべてC ++である」という議論には入りたくありません。また、C対C ++については説明しません。この質問はすべてC ++ 11についてです。 C ++ 11では、C ++の動作に大きな変化があると思うものを紹介していますが、さまざまな機能が異なる状況でどのように動作するかを変更する多くの特殊なケース、例外、不規則性を導入し、多重継承、キーワードとして機能する識別子、拡張機能を制限しています文字列リテラル、ラムダ関数変数のキャプチャなど 将来のある時点で、C ++と言うとき、誰もがC ++ 11を想定することを知っています。最近Cを言うときと同じように、おそらくC99を意味します。そのため、C ++ 11の学習を検討します。結局、C ++でコードを書き続けたい場合、同僚が持っているという理由だけで、これらの機能の使用を開始する必要があるかもしれません。 Cを例にとります。何年も経った今でも、Cでコードを学んだり書いたりする人がたくさんいます。なぜですか?言語が良いからです。良い意味は、優れたプログラミング言語を作成するための多くの規則に従っていることです。そのため、Cは強力である(ほとんどすべてのプログラミング言語がそうであるか難しい)ことに加えて、Cは規則的であり、もしあれば例外はほとんどありません。しかし、C ++ 11はそうは思いません。C ++ 11で導入された変更によって言語が改善されているかどうかはわかりません。 質問は次のとおりです。なぜC ++ 11を学ぶのでしょうか。
28 learning  c++  c  c++11 

3
C ++テンプレートのエラーメッセージはなぜ恐ろしいのですか?
C ++テンプレートは、読み取り不能な長いエラーメッセージを生成することで有名です。C ++のテンプレートエラーメッセージがなぜそんなに悪いのかについての一般的な考えがあります。基本的に、問題はコンパイラーがテンプレート内の特定の型でサポートされていない構文に遭遇するまでエラーがトリガーされないことです。例えば: template <class T> void dosomething(T& x) { x += 5; } 演算子がTサポートされていない場合+=、コンパイラはエラーメッセージを生成します。そして、これがどこかライブラリの奥深くで発生した場合、エラーメッセージは数千行に及ぶ可能性があります。 ただし、C ++テンプレートは基本的に、コンパイル時のダックタイピングのメカニズムにすぎません。C ++テンプレートエラーは、Pythonなどの動的言語で発生する可能性のあるランタイムタイプエラーに概念的に非常に似ています。たとえば、次のPythonコードを考えます。 def dosomething(x): x.foo() ここでx、foo()メソッドがない場合、Pythonインタープリターは例外をスローし、問題を示す非常に明確なエラーメッセージとともにスタックトレースを表示します。インタプリタが何らかのライブラリ関数の奥深くになるまでエラーがトリガーされない場合でも、ランタイムエラーメッセージは、典型的なC ++コンパイラによって吐き出される読み取り不能な嘔吐物ほど悪いものではありません。それでは、なぜC ++コンパイラが何が問題なのかをより明確にできないのでしょうか?一部のC ++テンプレートエラーメッセージにより、文字どおり、コンソールウィンドウが5秒以上スクロールするのはなぜですか?

9
ScalaがCまたはC ++で実装されなかった理由
ScalaがCやC ++ではなくJavaと.NETで実装された理由を知っている人はいますか?ほとんどの言語はCor C ++で実装されています(つまり、Erlang、Python、PHP、Ruby、Perl)。Javaおよび.NETライブラリにアクセスできること以外に、Javaおよび.NETで実装されたScalaの利点は何ですか? 更新 Scalaは、Cで実装された場合、JVMに依存するよりもより適切に調整できるため、より多くの利益を得られませんか?
28 java  c++  .net  c  scala 

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