問題タブ [c++03]
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++ - C++ のクラス初期化子で const 配列を初期化する
私はC++で次のクラスを持っています:
問題は、コンストラクターの関数の本体内で b を初期化できない場合、初期化リストで b を初期化する方法ですconst
。
これは機能しません:
編集: 適切なケースは、インスタンスごとに異なる値を持つことができる場合ですb
が、値はインスタンスの存続期間中一定であることが知られています。
design-patterns - C++ でどの Typesafe Enum を使用していますか?
C++ の組み込み列挙型がタイプセーフでないことはよく知られています。タイプセーフな列挙型を実装するクラスがどこで使用されているのか疑問に思っていました...私自身は次の「自転車」を使用していますが、やや冗長で制限があります。
typesafenum.h:
typesafenum.cpp:
使用法:
追加: 要件についてもっと具体的であるべきだったと思います。私はそれらを要約しようとします:
優先度 1: enum 変数を無効な値に設定することは、例外なく不可能 (コンパイル時エラー) であるべきです。
優先度 2: enum 値と int の間の変換は、単一の明示的な関数/メソッド呼び出しで可能にする必要があります。
優先度 3: 可能な限りコンパクトでエレガントで便利な宣言と使用法
優先度 4: enum 値と文字列との変換。
優先度 5: (あると便利) enum 値を反復処理できる可能性。
c++ - 同時実行のための C++03 メモリ モデルとは何ですか?
C++03 での同時実行のメモリ モデルは何ですか?
(そして、C++11 は並行性をより適切にサポートするためにメモリ モデルを変更しますか?)
c++ - =を使用してC++でプリミティブ型を初期化するのはなぜですか?
私が働いている場所では、オブジェクトは C++ スタイルの構築 (括弧付き) を使用して初期化するのが最適であると考える人がほとんどですが、プリミティブ型は = 演算子で初期化する必要があります。
しかし、彼らがなぜこのような方法を好むのか、誰も説明できないようです。余分なコピーが必要になるため、非効率的であることがわかりますが、演算子を完全に追放し、どこでも括弧を使用std::string = "Foo";
することの何が問題なのですか?=
それは共通の慣習ですか?その背後にある考えは何ですか?
c++ - クラスメンバー関数をコールバックとして渡すにはどうすればよいですか?
関数ポインターをコールバックとして渡す必要がある API を使用しています。クラスからこの API を使用しようとしていますが、コンパイル エラーが発生します。
コンストラクターから行ったことは次のとおりです。
これはコンパイルされません - 次のエラーが表示されます:
エラー 8 エラー C3867: 'CLoggersInfra::RedundencyManagerCallBack': 関数呼び出しに引数リストがありません。「&CLoggersInfra::RedundencyManagerCallBack」を使用して、メンバーへのポインターを作成します
使用する提案を試みましたが、&CLoggersInfra::RedundencyManagerCallBack
うまくいきませんでした。
これに対する提案/説明はありますか??
私はVS2008を使用しています。
ありがとう!!
c++ - C ++でスマートポインタを実装するための最良の方法は何ですか?
私はさまざまなスマートポインターの実装を評価してきましたが(うわー、そこにはたくさんあります)、それらのほとんどは2つの大まかな分類に分類できるようです。
1)このカテゴリは、参照されるオブジェクトの継承を使用して、参照カウントがあり、通常はup()およびdown()(またはそれらに相当するもの)が実装されているようにします。IE、スマートポインターを使用するには、ポイントしているオブジェクトは、ref実装が提供するクラスから継承する必要があります。
2)このカテゴリは、参照カウントを保持するためにセカンダリオブジェクトを使用します。たとえば、スマートポインターをオブジェクトに直接向ける代わりに、実際にはこのメタデータオブジェクトを指します...参照カウントとup()およびdown()の実装を持っている人(そして通常、ポインターのメカニズムを提供する人)スマートポインタが演算子->()を適切に実装できるように、ポイントされている実際のオブジェクトを取得します。
これで、1には、カウントを参照するすべてのオブジェクトが共通の祖先から継承するように強制されるという欠点があります。これは、ソースコードを制御できないカウントオブジェクトを参照するためにこれを使用できないことを意味します。に。
2には、カウントが別のオブジェクトに格納されているため、既存の参照カウントオブジェクトへのポインタが参照に変換されているという状況が発生した場合、おそらくバグが発生するという問題があります(つまり、カウントが実際のオブジェクトでは、新しい参照がカウントを取得する方法はありません... ref to refコピーの構築または割り当ては、カウントオブジェクトを共有できるため問題ありませんが、ポインタから変換する必要がある場合は、完全にホースで固定されています)..。
さて、私が理解しているように、boost :: shared_pointerはメカニズム2、またはそのようなものを使用しています...とはいえ、私は自分の決心を完全に決めることはできません。私はこれまで本番コードでメカニズム1のみを使用しました...誰かが両方のスタイルの経験がありますか?または、おそらくこれらの両方よりも優れた別の方法がありますか?
c++ - C ++ 03で「auto」キーワードを使用する理由はありますか?
この質問は、C ++ 11が承認される前、および
auto
キーワードの意味が大幅に変更される前の2009年に最初に投稿されたことに注意してください。提供された回答は、C ++ 03の意味(指定されたストレージクラスである)にのみ関係し、C ++ 11の意味(自動型推論)には関係しません。C ++ 11をいつ使用するかについてのアドバイスを探している場合、この質問はその質問とは関係ありません。auto
auto
auto
static
ブロックスコープの外で宣言された変数は暗黙的にグローバルであるため、長い間、Cでキーワードを使用する理由はないと思っていました。次に、変数をstatic
ブロックスコープ内として宣言すると永続的な期間が与えられ、ブロックスコープ外(プログラムスコープ内)で宣言するとファイルスコープ(そのコンパイルユニットでのみアクセス可能)が得られることを発見しました。
したがって、これにより、私が(おそらく)まだ完全には理解していないキーワードが1つだけ残ります。それはauto
キーワードです。「ローカル変数」以外の意味はありますか?あなたがそれを使いたいと思うかもしれないところはどこでもあなたのために暗黙のうちに行われていないことは何ですか?auto
変数はプログラムスコープでどのように動作しますか?static auto
ファイルスコープの変数はどうですか?このキーワードには、完全を期すために存在する以外の目的がありますか?
c++ - ミューテックスなしのスレッドセーフな静的変数?
メソッド内で宣言された静的変数はスレッドセーフではないことを読んだことを覚えています。(Todd Gardnerが述べたように、Meyerのシングルトンはどうですか?を参照してください)
私のライブラリは、エンドユーザーがアプリケーションの一部としてコンパイルするためのC++コードを生成します。生成されるコードは、スレッドセーフなクロスプラットフォーム方式で静的変数を初期化する必要があります。変数の初期化をミューテックスするために使用したいboost::call_once
のですが、エンドユーザーはBoostの依存関係にさらされています。
エンドユーザーに余分な依存関係を強いることなくこれを行う方法はありますか?
c++ - `is_complete` テンプレートの書き方
この質問に答えた後、Boost ライブラリでテンプレートを見つけようとis_complete
していましたが、Boost.TypeTraits にそのようなテンプレートがないことに気付きました。Boostライブラリにそのようなテンプレートがないのはなぜですか? それはどのように見えるべきですか?
sizeof
不完全な型に適用することは違法であるため、上記のコードは正しくありません。良い解決策は何ですか?この場合、どういうわけかSFINAEを適用することは可能ですか?
まあ、この問題はODR 規則に違反しない限り一般的に解決できませんでしたが、私にとって有効なプラットフォーム固有の解決策があります。
c++ - 「&s [0]」は、std :: string内の連続する文字を指しますか?
私はいくつかのメンテナンス作業を行っていて、次のようなものに遭遇しました:
&s[0]を使用するのがstd:: vectorの場合は安全だと思いますが、これはstd :: stringの安全な使用ですか?