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

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

6
関数が誤って参照パラメーターを無効にします-何が間違っていましたか?
今日、特定のプラットフォームでのみ断続的に発生する厄介なバグの原因を発見しました。要約すると、コードは次のようになりました。 class Foo { map<string,string> m; void A(const string& key) { m.erase(key); cout << "Erased: " << key; // oops } void B() { while (!m.empty()) { auto toDelete = m.begin(); A(toDelete->first); } } } この単純化されたケースでは、問題は明らかなように見えBます。キーへの参照を渡してA、マップエントリを削除してから印刷しようとします。以来、これはもちろん、未定義の動作である(私たちの場合は、それが印刷されなかったが、より複雑な方法で使用される)keyへの呼び出し後にダングリング参照ですerase。 これを修正するのは簡単でしconst string&たstring。パラメータタイプをからに変更しました。問題は、そもそもどうやってこのバグを回避できたのでしょうか?両方の機能が正しいことをしたようです: Akey破壊しようとしているものを参照していることを知る方法がありません。 Bに渡す前にコピーを作成できたかもしれAませんが、値または参照によってパラメータを取るかどうかを決定するのは呼び出し先の仕事ではありませんか? 従わなかったルールはありますか?
54 c++ 

10
「final」キーワードが役立つのはなぜですか?
Javaには長い間派生できないクラスを宣言する力があったように思われますが、現在はC ++にもあります。しかし、SOLIDのOpen / Close原則に照らして、なぜそれが役立つのでしょうか?私には、finalキーワードのように聞こえますfriend-それは合法ですが、あなたがそれを使用している場合、ほとんどの場合、設計が間違っています。派生不可能なクラスが優れたアーキテクチャまたはデザインパターンの一部になるような例をいくつか提供してください。
54 java  c++  solid  final 

5
参照カウントのスマートポインターが人気があるのはなぜですか?
ご覧のとおり、スマートポインターは多くの実際のC ++プロジェクトで広く使用されています。 ある種のスマートポインターはRAIIと所有権の移行をサポートするために明らかに有益ですが、プログラマーが割り当てをそれほど考慮する必要がないように、「ガベージコレクション」の方法として共有ポインターをデフォルトで使用する傾向もあります。 Boehm GCのような適切なガベージコレクターを統合するよりも、共有ポインターの方が人気があるのはなぜですか?(または、実際のGCよりも人気があることにまったく同意しますか?) 参照カウントに対する従来のGCの2つの利点について知っています。 従来のGCアルゴリズムには、参照サイクルに関する問題はありません。 参照カウントは通常、適切なGC よりも遅くなります。 参照カウントスマートポインターを使用する理由は何ですか?

8
C ++のゴミはどうなりますか?
Javaには自動GCがあり、たまに世界を停止しますが、ヒープ上のゴミを処理します。現在、C / C ++アプリケーションにはこれらのSTWフリーズがなく、メモリ使用量も無限に増加しません。この動作はどのように達成されますか?死んだオブジェクトはどのように処理されますか?

3
例外の仕様が悪いのはなぜですか?
約10年以上前の学校に戻って、彼らは例外指定子の使用を教えていました。私のバックグラウンドは彼らの1人であるため、強制されない限り頑固にC ++を避けるトーバルディッシュCプログラマーなので、私は散発的にC ++になってしまい、私が教えられたので例外指定子を使用しています。 ただし、C ++プログラマの大半は、例外指定子に眉をひそめているようです。これらのようなさまざまなC ++の達人からの議論と議論を読みました。私の知る限り、それは次の3つに要約されます。 例外指定子は、残りの言語と矛盾する型システムを使用します(「シャドウ型システム」)。 例外指定子を持つ関数が、指定したもの以外の何かをスローする場合、プログラムは悪い、予期しない方法で終了します。 例外指定子は、今後のC ++標準で削除される予定です。 ここで何かが足りないのですか、それともすべての理由ですか? 私自身の意見: 1)に関して:それで何。C ++はおそらく、構文的にはこれまでに作成された中で最も一貫性のないプログラミング言語です。マクロ、goto / labels、undefined- / unspecified- / implementation-defined動作の大群(hoard?)、不十分に定義された整数型、すべての暗黙的な型昇格規則、friend、autoなどの特別な場合のキーワードがあります。 、登録、明示...など。おそらく、C / C ++のすべての奇妙さについての厚手の本をいくつか書くことができます。それでは、なぜ人々はこの特定の矛盾に反応するのでしょうか。これは、言語の他の多くのより危険な機能と比較して、小さな欠陥です。 2)に関して:それは私自身の責任ではありませんか?C ++で致命的なバグを作成できる方法は他にもたくさんありますが、なぜこの特定のケースはさらに悪いのでしょうか?throw(int)Crash_t を記述してからスローする代わりに、関数がintへのポインターを返し、ワイルドで明示的な型キャストを行い、Crash_tへのポインターを返すと主張することもできます。C / C ++の精神は、ほとんどの責任をプログラマに任せることでした。 では、利点はどうですか?最も明白なのは、関数が指定したもの以外の型を明示的にスローしようとすると、コンパイラーがエラーを出すことです。これに関しては標準が明確だと思います(?)。バグが発生するのは、関数が他の関数を呼び出し、その関数が間違った型をスローした場合のみです。 決定論的な組み込みCプログラムの世界から来た私は、関数が私に投げかけるものを正確に知ることを最も確実に好むでしょう。それをサポートする言語に何かがあれば、それを使用してみませんか?選択肢は次のようです: void func() throw(Egg_t); そして void func(); // This function throws an Egg_t 呼び出し元が2番目のケースでtry-catchを実装することを無視/忘れる可能性は大きいと思いますが、1番目のケースではそうではありません。 私が理解しているように、これら2つの形式のいずれかが突然別の種類の例外をスローすることにした場合、プログラムはクラッシュします。最初のケースでは、別の例外をスローすることが許可されていないため、2番目のケースでは、SpanishInquisition_tをスローすることを誰も期待していないため、その式は本来あるべき場所にキャッチされません。 後者の場合、プログラムの最高レベルで最後の手段としてcatch(...)を使用することは、プログラムクラッシュよりも優れているようには見えません。「ねえ、あなたのプログラムのどこかで、奇妙な未処理の例外がスローされました。 。 "。例外がスローされた場所から遠く離れると、プログラムを回復できません。できることは、プログラムを終了することだけです。 また、ユーザーの観点からは、OSから「プログラムが終了しました。アドレス0x12345のBlablabla」という悪意のあるメッセージボックス、またはプログラムから「未処理の例外:myclass」という悪意のあるメッセージボックスを受け取ったとしても、それほど気にすることはありませんでした。 …

11
C ++には「未定義の動作」(UB)があり、C#やJavaなどの他の言語にはないのはなぜですか?
このStack Overflowの投稿には、C / C ++言語仕様が「未定義の動作」であると宣言している状況のかなり包括的なリストがリストされています。ただし、C#やJavaなどの他の現代言語に「未定義の動作」という概念がない理由を理解したいと思います。つまり、コンパイラの設計者は、考えられるすべてのシナリオ(C#およびJava)を制御できるかどうか(CおよびC ++)を制御できますか?

3
C ++で強く型付けされたtypedef
私は、コンパイル段階で特定の種類のバグをキャッチするために、強く型付けされたtypedefを宣言する方法を考えていました。多くの場合、intをいくつかのタイプのIDにtypedefするか、位置または速度を指定するベクトルを入力します。 typedef int EntityID; typedef int ModelID; typedef Vector3 Position; typedef Vector3 Velocity; これにより、コードの意図をより明確にすることができますが、長い夜のコーディングの後、さまざまな種類のIDを比較したり、速度に位置を追加したりするなど、愚かな間違いを犯す可能性があります。 EntityID eID; ModelID mID; if ( eID == mID ) // <- Compiler sees nothing wrong { /*bug*/ } Position p; Velocity v; Position newP = p + v; // bug, meant p + v*s but …
49 c++  c++11  type-safety 

5
すべての<algorithm>関数がコンテナーではなく範囲のみを取得するのはなぜですか?
には多くの便利な関数がありますが&lt;algorithm&gt;、それらはすべて「シーケンス」、つまりイテレータのペアで動作します。たとえば、コンテナがあり、そのstd::accumulate上で実行したい場合、次のように書く必要があります。 std::vector&lt;int&gt; myContainer = ...; int sum = std::accumulate(myContainer.begin(), myContainer.end(), 0); 私がやろうとしているのは: int sum = std::accumulate(myContainer, 0); 私の目では、これはもう少し読みやすく、はっきりしています。 コンテナの一部のみを操作したい場合があるかもしれないので、範囲を渡すオプションがあることは間違いなく便利です。しかし、少なくとも私の経験では、それはまれな特別なケースです。私は通常、コンテナ全体を操作したいと思うでしょう。 これは、コンテナとのコールを取るラッパー関数書くのは簡単だbegin()し、end()その上に、このような便利な機能が標準ライブラリに含まれていません。 このSTL設計の選択の背後にある理由を知りたい。

9
LinuxでのC ++およびC開発用のIDEの比較:KDevelop、Eclipse、NetBeans、CodeBlocks、およびAnjuta [非公開]
LinuxでのフルスケールIDEの経験に注目したいと思います。 私は個人的に主に仕事をしていますがvim、他のプログラマは本当のIDEを見たいと思っています。だから私は、次のコンテキストで、異なるIDEとそれらの間の比較についてのあなたの個人的な意見を聞きたいです。 C ++および多分C開発(Java、Pythonおよび他のものではない) サーバー側のプログラミング(GUI開発は不要) 「クロスプラットフォーム」開発ではなく、Linuxで作業しています。 意見が必要です: どのくらい安定していますか?IDEがクラッシュした場合、必要ありません。 使いやすい。 デバッグに強力です。 さまざまなビルドシステムとの統合 巨大なプロジェクト(数十万行のコードのプロジェクト)に対するスケーラビリティ 私はかつてKDevelopで働いていましたが、非常に素晴らしいIDEであり、KDevelop 4は大きな進歩を遂げているようです。また、多くの人がむしろNetbeansとEclipseを使用しているようです。
49 c++  ide  linux 

9
「教えてはいけない」が良いオブジェクト指向とみなされる方法の説明
このブログ投稿は、いくつかの賛成票とともにHacker Newsに投稿されました。C ++から来るこれらの例のほとんどは、私が教えてきたものに反するようです。 例#2など: 悪い: def check_for_overheating(system_monitor) if system_monitor.temperature &gt; 100 system_monitor.sound_alarms end end 良い対: system_monitor.check_for_overheating class SystemMonitor def check_for_overheating if temperature &gt; 100 sound_alarms end end end C ++でのアドバイスは、カプセル化を増やすため、メンバー関数ではなくフリー関数を好むことです。これらは両方とも意味的に同一なので、なぜより多くの状態にアクセスできる選択肢を好むのでしょうか? 例4: 悪い: def street_name(user) if user.address user.address.street_name else 'No street name on file' end end 良い対: def street_name(user) user.address.street_name end …

2
ヘッダーのみのライブラリはより効率的ですか?
仮定 C ++のヘッダー専用ライブラリの利点の1つは、個別にコンパイルする必要がないことです。 CおよびC ++ inlineでは、関数がヘッダーファイルで定義されている場合にのみ意味があります*。 従来、Cでは、ヘッダーが翻訳単位の最小限のパブリックインターフェイスを表す.c / .hレイアウトが使用されてきました。同様に、.cpp / hpp。 質問 一般に、ヘッダーのみのライブラリは、従来のレイアウトよりもコードおよび実行時間の面で効率的ですか?もしそうなら、これは広範なインライン展開または他の最適化のためですか? *-ヘッダーで関数を定義することで、コンパイラーは翻訳単位のコンパイル中に実装を確認でき、実際にインライン化コードが可能になります
48 c++  c  libraries 

8
仮想デストラクタを使用しない場合
私は仮想デストラクターについて何度も検索し、ほとんどが仮想デストラクターの目的と、仮想デストラクターが必要な理由に言及していると信じていました。また、ほとんどの場合、デストラクタは仮想である必要があると思います。 質問は次のとおりです。なぜC ++はデフォルトですべてのデストラクタを仮想に設定しないのですか?または他の質問: 仮想デストラクタを使用する必要がないのはいつですか? どの場合、仮想デストラクタを使用すべきではありませんか? 仮想デストラクタを使用しなくても、それを使用する場合のコストはいくらですか?

4
最初のC ++コンパイラはどのようにC ++で作成できますか?
Stroustrupは、最初のC ++コンパイラであるCfrontがC ++で作成されたと主張しています(Stroustrup FAQ)。 しかし、最初のC ++コンパイラをC ++で作成することはどのように可能ですか? コンパイラーを構成するコードもコンパイルする必要があります。したがって、最初のC ++コンパイラーをC ++で作成することはできませんでしたか?

11
インタビュアーが自分の質問に対する答えを知らない場合、私は何ができますか?[閉まっている]
昨日、インタビューでひどい経験をしました。 インタビュアーは、純粋な仮想機能について尋ねました。基本クラスに定義がある場合とない場合がありますが、派生クラスは抽象クラスにもなりたくない限り、定義を提供する必要があります。 しかし、インタビュアーは、「純粋仮想には定義があります!!! ???」と尋ね続けました。 再び彼は「純粋?」と言った。 もちろん。派生クラスは、特定の動作が必要な場合、明示的にその関数を呼び出すことができます。 彼は私を送った。彼は純粋な仮想関数が定義を持つことができるという事実を知らないと確信しています。 この種のインタビュアーに対処するには? 2回目に尋ねた後、定義できないと嘘をつくべきですか?:) それとも私は私の言葉に固執し、仕事の機会を失う必要がありますか?
48 c++  interview 

3
CおよびC ++を使用したAndroid開発[終了]
私はC、C ++開発者です。モバイル開発に興味があります。CとC ++を使用してAndroidアプリを開発する方法を知りたいのですが、C、C ++開発者向けのキットを提供しているが、Javaキットのすべての機能を備えているわけではないことを読みました。C / C ++開発キットに行くべきですか、それとも将来すべての機能を提供しないかもしれないので、Javaを学ぶほうがよいでしょうか?
47 c++  c  android 

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