問題タブ [effective-c++]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 「コピー不可」クラス使用時の GCC 警告のサイレンシング
コピー可能にしたくないクラスがいくつかあります。これらのクラスのいくつかには、ポインター データ メンバーがあります。これらのクラスをコピーできないようにするために、次のクラス テンプレートを個人的に継承します。
私は次のように使用しました:
これは問題なく動作しますが、-Weffc++ でコンパイルすると、次の警告が引き続き表示されます。
なぜまだこの警告が表示されるのですか?
c++ - インタビューの質問; 効果的なC++の主なテーマは何ですか?
最近の就職の面接で次の質問がありました。
スコット・メイアーズのEffective C ++シリーズをまとめたメインテーマ/一言は何だと思いますか?
この質問に対するあなたの答えは何ですか?
c++ - ヘッダーファイルの「constchar*」に値を設定するのは適切ですか?
私は、宣言と定義に2つのメソッドを使用している人々を見てきchar *
ました。
Medhod 1:ヘッダーファイルには以下があります
Medhod 2:
ヘッダーファイルには次の宣言があります。
cppファイルの定義は次のとおりです。
- 方法1は何らかの形で間違っていますか?
- 2つの違いは何ですか?
const char * const var
「 」と「」の違いがわかりconst char * var
ます。上記のメソッドでconst char * const var
、メソッド1のようにヘッダーで「」が宣言および定義されている場合、それは意味がありますか?
c++ - C++: STL イテレータでの const の使用
有効な C++の項目 3から
どのようconst
に適用されるかを覚えておくために、私はこの記事から次のことを覚えていました
基本的に、'const' はそのすぐ左にあるものに適用されます (何もない場合を除き、そのすぐ右にあるものに適用されます)。
本の項目 3 を最初に読んだとき、ケース 1 とケース 2 で逆になると思っていました。
このケースは例外として扱うべきですか? それとも、私が見逃しているより深いレベルの理解がありますか?
c++ - 基底クラスからサブクラス ポインタへのダウンキャストについて
静的チェック ツールは、以下のコードで違反を示します。
エラー メッセージ:クラス 'CSplitFrame' は、クラス 'CWnd' を継承しています
説明:継承階層を下にキャストしないようにします。このルールは、基本クラス ポインターからサブクラス ポインターへのキャストを検出します。
利点:継承階層の下位へのキャストを許可すると、メンテナンスの問題が発生し、基底クラスからの下位キャストは常に違法になります。
参考文献:
- Scott Meyers、「効果的な C++: プログラムと設計を改善するための 50 の具体的な方法」、第 2 版、Addison-Wesley、(C) 2005 Pearson Education, Inc.、章:「継承とオブジェクト指向設計」、項目 39
- JOINT STRIKE FIGHTER、AIR VEHICLE、C++ コーディング標準、第 4.23 章型変換、AV ルール 178
基本クラスのポインターからサブクラスのポインターにキャスト ダウンしないことは良い習慣だと思いますか? なぜ、いつこのルールに従う必要があるのですか?
c++ - 前方宣言インクルード、宣言インクルードの上に (ClassFwd.h + Class.h)
効果的な C++ (第 3 版) の項目 31 で、Scott Meyers は、クラスが従来の宣言 (.h) および定義 (.cpp) ファイルに加えて、前方宣言インクルード ファイル (fwd.h) を持つ必要があることを示唆しています。完全な定義を必要としないクラスは、自身を前方宣言する代わりに使用できます。
私はそれのケースをいくらか見ていますが、これを実行可能なオプションとは本当に思いません...維持するのは非常に難しく、かなりやり過ぎで、ほとんど必要ではないようです。
ただし、かなり重いテンプレートの前方宣言に使用されていることがわかります。しかし、単純なクラスの場合は?維持するのは苦痛であり、非常に小さな目的を果たすほとんど空のインクルードファイルを大量に作成するようです...手間をかける価値はありますか?
次に例を示します。
私の質問:
皆さんはどう思いますか?これは良い習慣ですか?
注: 私は主に、この慣行の議論に関心があります。Scott Meyers に同意させる何かを見落としていないかどうかを確認するためです。
c++ - 派生クラス内からの operator = の呼び出し
これは、Effective C++ 2nd edition scott meyers (page 70) の項目 16 からのものです。
著者は、基本クラスの operator = が次のように呼び出されると、あまり説明せずに書いています。
一部のコンパイラは (間違ってはいますが) コンパイラによって生成された場合はこれを拒否しますoperator =
(項目45 を参照)。
項目 45 で、基本クラスoperator =
がプライベートの場合、派生クラス=
にはそれを呼び出す権利がないと述べています。
しかし、元の質問では、コンパイラーによって生成されたため、コンパイラーはそれを拒否していました(公開する必要があります)
これに関するヘルプ(リンク)は役に立ちます。(これらのタイプの質問をグーグルで検索するのは非常に困難です)
c++ - 有効な C++ 項目 23 メンバー関数より非メンバー非フレンド関数を優先する
クラス設計に関するいくつかの事実、具体的には関数がメンバーであるべきかどうかについて戸惑いながら、私はEffective c++を調べて、アイテム23、つまりメンバー関数よりも非メンバー非フレンド関数を優先することを見つけました。Web ブラウザーの例で最初にそれを読むと、ある程度の意味がありましたが、その例の便利な関数 (本ではこのような非メンバー関数と呼ばれます) はクラスの状態を変更しますよね?
それでは、最初の質問です。
もう少し読んで、彼は STL 関数を検討します。実際、一部のクラスで実装されていない一部の関数は stl で実装されています。
std::sort
本のアイデアに従って、それらは、std::copy
fromなどのいくつかの合理的な名前空間にパックされたいくつかの便利な関数に進化しますalgorithm
。たとえば、vector
クラスには関数がなくsort
、stlsort
関数を使用するため、ベクトル クラスのメンバーではありません。assign
しかし、メンバーとしてではなく便利な関数として実装できるように、同じ推論をベクトルクラスの他の関数に拡張することもできます。ただし、それは操作対象のソートなどのオブジェクトの内部状態も変更します。では、この微妙だが重要な (私が推測する) 問題の背後にある理論的根拠は何でしょうか。
もしあなたがその本にアクセスできるなら、これらの点をもう少し明確にしてもらえますか?
c++ - 効果的なC++「35。ファイル間のコンパイル依存関係を最小限に抑える」。それは今日でも有効ですか?
この章では、Scott Meyerが、ヘッダーファイルの依存関係を回避するためのいくつかの手法について説明しました。主な目標は、変更が他のインクルードされたヘッダーファイルに限定されている場合に、cppファイルの再コンパイルを回避することです。
私の質問は次のとおりです。
私の過去のプロジェクトでは、このルールに注意を払ったことはありませんでした。コンパイル時間は短くはありませんが、耐えられません。それは私のプロジェクトの規模(または欠如)ともっと関係があるかもしれません。コンパイラ技術(clangなど)の進歩を考えると、このヒントは今日どれほど実用的ですか?
このテクニックの使用例はどこにありますか?(例:Gnomeまたはその他のOSSプロジェクト)
PS私は第2版を使用しています。
c++ - 効果的なC++:保護された継承を思いとどまらせる?
私はScottMeyersのEffectiveC++(第3版)を読んでいて、項目32の段落で:パブリック継承が151ページの「is-a」であることを確認してください。
これは、パブリック継承にのみ当てはまります。C ++は、StudentがPersonから公に派生している場合にのみ、私が説明したように動作します。プライベート継承とはまったく異なるものを意味し(項目39を参照)、保護された継承とは、今日までその意味が理解できないものです。
質問:このコメントをどのように解釈すればよいですか?マイヤーズは、保護された継承が有用であるとはめったに考えられず、避けるべきであることを伝えようとしていますか?
(私は 、プライベート、パブリック、および保護された継承の違いと、C ++ FAQ Liteのプライベートおよび保護された継承のセクションを読みました。どちらも保護された継承の意味を説明していますが、いつ、なぜそれが行われるのかについてはあまり洞察がありません。役に立つでしょう。)