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

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

3
C ++では、仮想メソッド宣言でfinalをいつ使用すればよいですか?
final仮想メソッドが派生クラスによってオーバーライドされるのを防ぐためにキーワードが使用されていることを知っています。ただし、メソッドでキーワードを実際に使用する必要がある場合に役立つ例はありません。さらに、仮想メソッドでの使用は、プログラマが将来クラスを拡張することを許可しないため、悪臭のように感じられます。finalvirtualfinal 私の質問は次です: メソッド宣言finalで実際に使用する必要がある有用なケースはありますvirtualか?
11 c++  final 

3
「(int)値&0x1、(int)値&0x2、(int)値&0x4、(int)値&0x8」はどういう意味ですか? "
「値」の範囲は0〜15です(可能な値)。これらの4つの「if」条件はいつ満たされますか?(int)value = 2の場合、これは0010を意味しますか? if ((int)value & 0x1) { //statement here } if ((int)value & 0x2) { //statement here } if ((int)value & 0x4) { //statement here } if ((int)value & 0x8) { //statement here }

9
C ++標準を知っていることはどれほど重要ですか。
検索を試みましたが、同様の質問は表示されませんでした(それまたは私の検索用語が正しくありませんでした。もしそうなら、遠慮なく閉じてください)。 私はSOの熱心なユーザーであり、ディスカッションと回答にはC ++標準への参照がたくさんあることに気づきました-そして私は認めざるを得ません。 、問題は、C ++開発者がこのドキュメントを読んだことがなくても、本当に生活のためのコードを書けるかどうかです。コンパイラを書くビジネスに従事していない私たちにとって、それは本当に重要ですか?
11 c++  standards 

2
多数のコンポーネントで使用される「グローバル」構成クラスを作成するためのベストプラクティス
ドライバーパーツと、さまざまな関連タスクを実行する約5つのライブラリーを持つ大規模なプロジェクトがあります。ライブラリの多くは、起動時にドライバーコードによってデータベースから読み取られる「グローバル」構成データへのアクセスを必要とします。ドライバーとは、メイン機能を含む部分を意味します。 これを処理する方法についての私の考えは、構成項目を取得する静的メソッドを使用して構成クラスを作成することでした。これは最善の方法ですか?他にどのようにこれを達成できますか? 例えば: class config { public: static get_item(key); private: static values; }; シングルトン設計はここで適切ですか?

3
依存性注入:すべてのパーツを保持するCarクラスを作成する必要がありますか?
私のC ++アプリケーションには多くの車があり、すべてRaceTrackに含まれています。 各車は何百ものパーツで構成されています。各部分は他の部分に依存しています。 私はDIとMark Seemannの本で多くのSO質問を読みましたが、すべての自動車部品は相互に依存し、この部品のスープは自動車なので、自動車部品を保持するためだけにCarクラスを定義するべきではないようです。私は正しいですか? したがって、すべてのレーシングカーをRaceTrackに配置すると、自動車の実体はなく、トラック上で互いにレーシングし合うことに依存する多くの自動車部品がありますか?私は正しいですか? 編集: 車のロジックをプログラミングしている場合は車のクラスが必要であることは明らかだったので、長い間私は車のクラスをプログラミングしていました。しかし、DIでは、それは私にはそれほど明白ではありません。Carクラスが定義されていない場合にCarクラスを作成しないのは、DIの慣用句ですか? つまり、運転用にSteeringWheelを、ピットクルー用にホイールにBoltsAndNutsを配置し、車全体を表すインスタンスがなくても、他のあらゆる種類の面白いインターフェースを配置しても問題ありませんか?

5
C ++での冗長文字列割り当ての最適化
パフォーマンスが問題となっているかなり複雑なC ++コンポーネントがあります。プロファイリングは、実行時間のほとんどがstd::stringsのメモリの割り当てに費やされていることを示しています。 これらの文字列には多くの冗長性があることを知っています。一握りの値は非常に頻繁に繰り返されますが、固有の値もたくさんあります。文字列は通常かなり短いです。 私は今、それらの頻繁な割り当てを何らかの形で再利用することが理にかなっているのかどうか考えています。1000の異なる「foobar」値への1000のポインターの代わりに、1つの「foobar」値への1000のポインターを持つことができます。これによりメモリ効率が向上するという事実は素晴らしいボーナスですが、ここでは主に待機時間について心配しています。 すでに割り当てられた値のある種のレジストリを維持することは1つのオプションだと思いますが、レジストリの検索を冗長なメモリ割り当てよりも高速にすることは可能ですか?これは実行可能なアプローチですか?

5
C ++コードでクラスの相互依存を解決するにはどうすればよいですか?
私のC ++プロジェクトには、2つのクラスとがParticleありContactます。でParticleクラス、Iは、メンバ変数有するstd::vector<Contact> contactsのすべての連絡先含まParticleオブジェクトを、対応するメンバ関数をgetContacts()とaddContact(Contact cont)。したがって、「Particle.h」には「Contact.h」を含めます。 ではContact、クラス、私はのためのコンストラクタにコードを追加したいContactことが呼び出すParticle::addContact(Contact cont)ように、contacts両方のために更新されてParticleいる間でオブジェクトContactオブジェクトが追加されています。したがって、「Contact.cpp」に「Particle.h」を含める必要があります。 私の質問は、これが許容できる/適切なコーディングプラクティスであるかどうかであり、そうでない場合は、達成しようとしていることを実装するためのより良い方法は何ですか(簡単に言えば、新しい連絡先のたびに特定の粒子の連絡先のリストを自動的に更新します)創造された)。 これらのクラスは、NetworkN個の粒子(std::vector<Particle> particles)とNc個の接触(std::vector<Contact> contacts)を持つクラスによって結合されます。しかし、私は次のような関数を使用できるようにしたかったのです。この場合、クラスにparticles[0].getContacts()そのような関数があっても大丈夫ですParticleか、またはこの目的のためにC ++でより良い関連付け「構造」があります(別のクラスで使用されている2つの関連クラスの) 。 私はこれにどのように取り組んでいるのか、ここで視点のシフトが必要かもしれません。2つのクラスはNetworkクラスオブジェクトによって接続されているため、接続情報をNetworkオブジェクトによって完全に制御するのが一般的なコード/クラス編成ですか(パーティクルオブジェクトはその連絡先を認識してはならず、その結果、getContacts()メンバーを持つべきではありません)関数)。次に、特定の粒子が何に接触しているかを知るために、Networkオブジェクトを介して(たとえばを使用してnetwork.getContacts(Particle particle))その情報を取得する必要があります。 Particleオブジェクトがその知識を持つこと(つまり、NetworkオブジェクトまたはParticleオブジェクトのいずれかを介して、その情報にアクセスするための複数の方法があること)は、あまり一般的ではない(おそらく推奨されない)C ++クラス設計でしょうか)?

3
多くの引数を持つコンストラクターの回避
だから私は異なるクラスのオブジェクトを作成するファクトリーを持っています。可能なクラスはすべて抽象祖先から派生しています。ファクトリーには構成ファイル(JSON構文)があり、ユーザーの構成に応じて、作成するクラスを決定します。 これを実現するために、ファクトリはJSON解析にboost :: property_treeを使用します。彼はptreeをウォークスルーし、どの具象オブジェクトを作成するかを決定します。 ただし、製品オブジェクトには多くのフィールド(属性)があります。具体的なクラスにもよりますが、オブジェクトには約5〜10個の属性があり、将来的にはさらに増える可能性があります。 そのため、オブジェクトのコンストラクターがどのように見えるかわかりません。私は2つの解決策を考えることができます: 1)製品のコンストラクターはすべての属性をパラメーターとして想定しているため、コンストラクターは最終的に10個以上のパラメーターになります。これは醜く、長くて読めないコード行につながります。ただし、利点は、ファクトリーがJSONを解析し、正しいパラメーターでコンストラクターを呼び出すことができることです。製品クラスは、JSON構成のために作成されたことを知る必要はありません。JSONや設定が含まれていることを知る必要はありません。 2)製品のコンストラクターは、property_treeオブジェクトという1つの引数のみを想定しています。次に、必要な情報を解析できます。構成内の情報が欠落しているか範囲外の場合、各製品クラスは適切に対応できます。ファクトリは、いくつかの製品に必要な引数を知る必要はありません。ファクトリーは、誤った構成の場合の対応方法を知る必要もありません。また、コンストラクターインターフェイスは統一されており、小さいです。ただし、デメリットとして、製品は必要な情報をJSONから抽出する必要があるため、JSONがどのように構成されているかを認識しています。 私は解決策2)を好む傾向があります。ただし、これが適切なファクトリパターンであるかどうかはわかりません。JSON構成で作成されていることを製品に通知するのは、どういうわけか間違っていると感じます。一方、新製品は非常に簡単に導入できます。 それについての意見はありますか?

2
コピーオンライトセマンティクスのメリット
コピーオンライトにはどのようなメリットがあるのでしょうか。当然、私は個人的な意見を期待していませんが、それが技術的かつ実用的に有益な方法で具体的な方法で実際に利用できる実際のシナリオです。そして、具体的には、&文字の入力を節約する以上のものを意味します。 明確にするために、この質問はデータ型のコンテキストにあります。割り当てまたはコピーの構築は暗黙的な浅いコピーを作成しますが、変更すると暗黙的なディープコピーが作成され、元のオブジェクトではなく変更が適用されます。 私が尋ねている理由は、COWをデフォルトの暗黙の動作として使用することのメリットを見つけられないようです。多くのデータ型に対してCOWが実装されているQtを使用します。実際にはすべて、動的に割り当てられたストレージがいくつかあります。しかし、それは実際にユーザーにどのようなメリットがありますか? 例: QString s("some text"); QString s1 = s; // now both s and s1 internally use the same resource qDebug() << s1; // const operation, nothing changes s1[o] = z; // s1 "detaches" from s, allocates new storage and modifies first character // s is still "some …
10 c++  qt 

1
マイクロコントローラー用RTOSのメッセージキュー
現在、マイクロコントローラー用のRTOSを書いています。全体がC ++ 11で書かれています-誰かが興味を持っていて、リポジトリへのリンクが一番下にある場合。 現在私は、スレッド間(または、割り込みハンドラーとスレッド間、または割り込みハンドラーと他の割り込みハンドラー間)でオブジェクトを受け渡すための単純なデータキューであるクラスを作成しています。通常、私は他のプロジェクトにあるいくつかの共通のAPIを追跡しようとすると、まだ私は持っている同時キューのいずれかの例が見つかりませんでしたemplace()機能とサポートタイムアウトを。 私の一般的な「問題」は、次の2つのインターフェースを決定できないことです。 (std::chrono::duration<Rep, Period>はテンプレートタイプです。わかりやすくするためにテンプレートのボイラープレートは省略しています) 最初のバージョン: template<typename T> class FifoQueue { public: ... template<typename... Args> int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args); int tryPopFor(T&, std::chrono::duration<Rep, Period>); int tryPushFor(const T&, std::chrono::duration<Rep, Period>); int tryPushFor(T&&, std::chrono::duration<Rep, Period>); ... } 2番目のバージョン: template<typename T> class FifoQueue { public: ... template<typename... Args> int tryEmplaceFor(std::chrono::duration<Rep, Period>, …

1
GCCがC ++とCのバイソンから再帰的降下パーサーに切り替えたのはなぜですか?
それを必要とする言語変更、またはバイソンがもはや適切または最適ではなくなったいくつかの実際的な理由はありましたか? 私は上を見ウィキペディア彼らが参照し、切り替えることGCC 3.4とGCC 4.1のリリースノート。 これらのリリースノートには次のように記載されています。 手書きの再帰降下C ++パーサーは、以前のGCCリリースからのYACC派生のC ++パーサーに取って代わりました。新しいパーサーには、C ++ソースコードのより適切な解析、拡張機能の処理、適切なセマンティクス分析と解析の間の(可能な場合は)明確な分離に必要な、大幅に改善されたインフラストラクチャが含まれています。新しいパーサーは、古いパーサーで見つかった多くのバグを修正します。 そして: 古いBisonベースのCおよびObjective-Cパーサーは、新しい、より高速な手書きの再帰下降パーサーに置き換えられました 私が知りたいのは、彼らが抱えていた実際の問題と、Bisonを使用して解決することが不可能/非実用的である理由です。
10 c++  c  parsing  compiler 

5
Pythonスクリプトが同等のC ++プログラムと同じくらい高速になるのを妨げる技術的な制限や言語機能はありますか?
私は長年のPythonユーザーです。数年前、私はC ++の学習を始めて、速度の点でC ++が何を提供できるかを確認しました。この間も、プロトタイピングのツールとしてPythonを使い続けました。これは良いシステムのように思われました:Pythonによるアジャイル開発、C ++での高速実行。 最近、私はますますPythonを使用しており、この言語を使用して以前にすぐに使用した落とし穴とアンチパターンをすべて回避する方法を学びました。特定の機能(リスト内包表記、列挙など)を使用するとパフォーマンスが向上することは私の理解です。 しかし、Pythonスクリプトが同等のC ++プログラムと同じくらい高速になるのを妨げる技術的な制限や言語機能はありますか?

2
副作用の多いコードの単体テスト
ロボットを実行するためのC ++コードを書き始めていますが、実際にできる場合は、単体テストを組み込む方法がわかりません。私は、自動的にスケジュールされて実行されるロボットの「コマンド」の作成を可能にするライブラリーを提供されています。これらのコマンドを作成するためのメカニズムは、それらが提供するコマンドの基本クラスをサブクラス化し、仮想実装することでvoid Initialize()、void Execute()、およびvoid End()方法を。これらの機能は、ロボットに対して何かを行う(モーターの実行、ピストンの伸長など)副作用のためにのみ実行されます。このため、ライブラリ全体をモックしてロボットの状態の前後を確認できるようにするまでは、ユニットテストをコードに添付する場所は実際にはありません。過度に負担にならない、これを単体テストする方法はありますか? 編集する ライブラリの機能について誤解を招いていたと思います。ライブラリは、ロボットへのインターフェースのほとんどとコマンド/スケジューリングシステムを提供するため、コマンドの基本クラスをモックするほど単純ではないため、ハードウェアへのインターフェース全体をモックする必要があります。残念ながら、そのための時間はありません。

3
暗黙の引数変換に依存することは危険だと考えられていますか?
C ++には、引数の型が予期されたものでない場合に、パラメーターの型の一致するコンストラクターを自動的に呼び出す機能があります(適切な名前はわかりません)。 これの非常に基本的な例はstd::string、const char*引数付きのを期待する関数の呼び出しです。コンパイラーは、適切なstd::stringコンストラクターを呼び出すコードを自動的に生成します。 読みやすさに関しては、私が思うほど悪いのでしょうか。 次に例を示します。 class Texture { public: Texture(const std::string& imageFile); }; class Renderer { public: void Draw(const Texture& texture); }; Renderer renderer; std::string path = "foo.png"; renderer.Draw(path); いいですか?それとも行き過ぎですか?私がそれをするべきではない場合、どういうわけかClangまたはGCCにそれについて警告させることができますか?

4
2つのクラス間の多対多の関係を表す良い方法は何ですか?
AとBの2つのオブジェクトタイプがあるとします。これらのオブジェクト間の関係は多対多ですが、どちらも他方の所有者ではありません。 AインスタンスとBインスタンスの両方が接続を認識する必要があります。片道だけではありません。 だから、これを行うことができます: class A { ... private: std::vector<B *> Bs; } class B { private: std::vector<A *> As; } 私の質問は次のとおりです。接続を作成および破棄する関数をどこに配置すればよいですか。 A :: Attach(B)である必要があります。これにより、A :: BsおよびB :: Asベクトルが更新されますか? または、B :: Attach(A)である必要があります。 それらのどちらも正しくないと感じています。コードの操作をやめて、1週間後に戻ってきた場合、A.Attach(B)とB.Attach(A)のどちらを実行するべきかを思い出すことができないと確信しています。 おそらくそれはこのような関数であるべきです: CreateConnection(A, B); ただし、グローバル関数を作成することは、クラスAとBのみを操作するための関数であることから、望ましくないように見えます。 別の質問:この問題/要件に頻繁に遭遇した場合、どうにかして一般的な解決策を作成できますか?おそらく、このタイプの関係を共有するクラスから派生したり、クラス内で使用できるTwoWayConnectionクラスですか? この状況に対処するための良い方法は何ですか... 1対多の「CがDを所有する」状況をうまく処理する方法を私は知っていますが、これはトリッキーです。 編集:より明確にするために、この質問には所有権の問題は含まれていません。AとBの両方が他のオブジェクトZによって所有されており、Zはすべての所有権の問題を処理します。AとBの間の多対多のリンクを作成/削除する方法にのみ興味があります。
10 c++  c++11 

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