問題タブ [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++ - nullのshared_ptrが必要なのはなぜですか?また、どのように使用できますか?
ScottMeyersのEffectiveC++の項目18で、インターフェイスを正しく使いやすく、正しく使いにくいようにする、と彼はnullshared_ptrについて言及しました。
と流行の割り当て操作
その場合、nullのshared_ptrを作成し、後で割り当てを行う必要がありますか?リソース(生のポインター)があるときはいつでも、shared_ptrを作成しないのはなぜですか?
前の例ではScottMeyersが完全な代入を示していなかったため、shared_ptrの代入演算子がオーバーロードされてこれを実行できると思いました。
しかし、私はブーストの実装で試しましたが、このようには機能しません。では、nullのshared_ptrを使用する意味は何ですか?
私はここで何かが欠けているとほぼ確信しています。誰かが私を助けてください。
ps。shared_ptrの初期化と割り当てについての詳細
この例は、 g ++(Ubuntu / Linaro 4.5.2-8ubuntu4)4.5.2および最新のブーストではコンパイルできません。
c++ - MinGWの「有効なC++」警告
MinGWには、ScottMeyersのEffectiveC++によって提案された警告を表示する有効にすることができるこのオプションがあります。私はその本を持っておらず、簡単にコピーを入手することも、今それを読む時間もないので、私の質問は、これらの「マイヤーズの警告」とは正確には何ですか?
c++ - 基底クラスへの static_cast(*this) が一時コピーを作成するのはなぜですか?
私はEffective C++を読んでいて、この例に出くわしました:
本は言う:
あなたが予期しないかもしれないことは、現在のオブジェクトでその関数を呼び出さないことです! 代わりに、キャストは *this の基本クラス部分の新しい一時的なコピーを作成し、そのコピーに対して onResize を呼び出します!
static_cast (上記のコード) が新しいコピーを作成するのはなぜですか? オブジェクトの基本クラス部分だけを使用しないのはなぜですか?
c++ - C++: Scott Meyers の「有効な STL」: 項目 31: 並べ替えオプションを知る: 理解に役立つ
良い一日!
彼の「効果的なSTL」で、スコット・マイヤーズは書いた
3 つ目は、反復子の順序付けられたコンテナー内の情報を使用して、リストの要素を配置したい位置に反復的に接合することです。ご覧のとおり、多くのオプションがあります。(項目 31、後編)
誰かが私にこのように説明できますか?
追加テキスト (コンテキストを理解するため):
アルゴリズム sort、stable_sort、partial_sort、および nth_element はランダム アクセス反復子を必要とするため、ベクトル、文字列、両端キュー、および配列にのみ適用できます。標準の連想コンテナで要素を並べ替えても意味がありません。そのようなコンテナは比較関数を使用して常に並べ替えられた状態を維持するためです。sort、stable_sort、partial_sort、または nth_element を使用したいが使用できない唯一のコンテナーは list であり、list はその sort メンバー関数を提供することで多少補償します。(興味深いことに、list::sort は安定した並べ替えを実行します。) リストを並べ替えたい場合はできますが、リスト内のオブジェクトに対して partial_sort または nth_element を使用したい場合は、間接的に行う必要があります。間接的なアプローチの 1 つは、ランダム アクセス イテレータを使用して要素をコンテナーにコピーし、目的のアルゴリズムをそれに適用することです。3 つ目は、反復子の順序付けられたコンテナー内の情報を使用して、リストの要素を配置したい位置に反復的に接合することです。ご覧のとおり、多くのオプションがあります。
c++ - ストリーム演算子を使用してロギングマクロを書き直し、C ++テンプレート関数を使用できますか?
私たちのプロジェクトでは、マクロを使用して、次のように1行のステートメントでロギングを簡単かつ簡単にします。
マクロは2番目のパラメーターをstringstream引数に変換し、それを通常のC++ロガーに送信します。これは、マルチパラメータのロギングステートメントを非常に簡潔にするため、実際にはうまく機能します。ただし、Scott Meyersは、Effective C ++ 3rd Editionで、「インライン関数のテンプレートを使用することで、マクロのすべての効率に加えて、通常の関数のすべての予測可能な動作と型安全性を得ることができます」と述べています(項目2)。予測可能な動作に関連するC++でのマクロの使用には多くの問題があることを知っているので、コードベースでできるだけ多くのマクロを排除しようとしています。
私のロギングマクロは次のように定義されています:
私はこれをマクロを使用しないものに書き直すことを何度か試みました。
と...
役に立たない(上記の2つの書き換えのいずれも、最初の例のロギングコードに対してコンパイルされません)。他のアイデアはありますか?これはできますか?それとも、マクロのままにしておくのが最善ですか?
c++ - 複数のオブジェクトの構築を防ぐ
私はEffective C++を読んでいるので、複数のオブジェクトの構築を防ぐクラスを実装しようとしました(項目4):
boolWrapper の T() 構造が boolWrapper コンストラクターの本体の前に呼び出されないのはなぜですか? boolWrapper には T 型のデータ メンバーがなく、T から継承されない (親 ctor が暗黙的に呼び出されない) ためですか?
また、解決策をグーグルで検索せずにこれをコーディングしましたが、設計上のエラーはありましたか?
c++ - 参照カウントについて混乱している
事前にご協力いただきありがとうございます。私は Scott Meyers 著の「より効果的な C++」という本を読んでいますが、項目 29「参照カウント」の単純なプログラムの 1 つに本当に混乱しています。プログラムは次の場所にコピーされます。
String::String(const String& rhs): value(rhs.value)
{
++value->refCount;
}
次にコード:
なぜ s1 と s2 の両方が refCount 2 になるのか、私は本当に混乱しています。 refCount はまったく変更されません。私を修正してください!! 再度、感謝します。
よろしくお願いします。
c++ - C++ のテンプレート、列挙型を使用する必要がある理由
Scott Meyers の「Effective C++」の項目 48 について簡単な質問があります。以下の本からコピーしたコードがわかりません。
テンプレート プログラミングで enum を使用する必要があるのはなぜですか? これを行う別の方法はありますか?事前に助けてくれてありがとう。
c++ - 効果的な c++ 項目 3 の例
私の質問は、書籍「Effective C++」の特定の項目 (3) に関するものです。この本は、vs 2010 c++ (iostream と string を含む) にできるだけ近いものを再現しようとしたこの例を示しています。
そして、次のコンパイル エラーが発生します。
最初に言っておきますが、この本の初期段階ですでに立ち往生していることに落胆しています。私はどういうわけかここで情報を見つけました:
static_cast<const A>(*this) と static_cast<const A&>(*this) の違いですが
、本のような実用的な答えではありません。本の例を機能させて、それがどのように機能するかを理解できるようにしたいと思います。私はこれで何日も立ち往生しており、助けが必要であることを認めなければなりません. ここで基本的な概念が欠けているのか、それとも頭がおかしいのか知りたいです。ありがとう。
c++ - 「オブジェクト内部にハンドルを返さないようにする」ため、代替手段は何ですか?
Scott Meyers による効果的な C++は、第 5 章の項目 28 で、「ハンドル」(ポインター、参照、またはイテレーター) をオブジェクト内部に返さないように指示しており、それは間違いなく良い点です。
つまり、これをしないでください:
カプセル化を破棄し、プライベート オブジェクト メンバーを変更できるようにするためです。
これもしないでください:
「ぶら下がりハンドル」につながる可能性があるためです。つまり、既に破棄されているオブジェクトのメンバーへの参照を保持することになります。
さて、私の質問は、良い代替手段はありますか? お母さんが重いと想像してみてください!ここで、参照ではなく Mother のコピーを返すと、GetMother はかなりコストのかかる操作になります。
このような場合はどのように処理しますか?