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

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

3
ソフトウェアを修正してリアルタイムにする方法は?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 3年前休業。 最初に、私はリアルタイムシステムプログラミングの初心者であることを述べたいので、私の質問が正しいかどうかはわかりません。申し訳ありませんが、私はいくつかの助けが必要です 簡単に言え ば、ハードリアルタイムソフトウェアを実装して、ハードデッドラインに確実に対応する方法を教えてください。QNXのいくつかの機能を使用する必要がありますか?それともLinuxでQNXに移植するだけで十分であり、デフォルトでリアルタイムになりますか? 完全な質問: Linux、Windows、Android、QNXのプロセス間通信を備えた複雑なクロスプラットフォームマルチプロセスソフトウェアを実装しました。プログラミング言語はC ++です。他のライブラリのBoostとPlantyを使用しています。私たちのソフトウェアはそれをうまく素早く実行しますが、それでもプロトタイプです。本番環境ではリアルタイムで実行する必要があります。一部の機能はリアルタイムで非常に堅牢である必要があります。これらの機能は非常に重要であり、ソフトウェアを使用するユーザーの安全性に依存している可能性があるためです。それらはかなり速く動作します-数百ミリ秒まで。しかし、この事実のため、私たちのシステムが本当にリアルタイムであるかどうかはわかりません(私は正しいですか?)。 ですから、主な質問があります。ソフトウェアをリアルタイムに変更する方法は?私はたくさんググってみましたが、どうすればいいのかまだわかりません。 プラットフォームに関するいくつかの追加情報:現在テスト目的でのみ使用しているLinuxおよびWindows。Android-必要かどうかはまだ決まっていません。QNX-本番環境のターゲットOSです。次の質問の答えは「いいえ」だと思います:)しかし、クロスプラットフォームのリアルタイムソフトウェア(リアルタイムOS(RTOS)および汎用OS(GPOS)の場合)を実装することはまったく可能ですか? おそらく、QNXにのみすべてのリアルタイム機能を実装するよう努力する必要があるでしょうか。しかし、私はまだそれを行う方法を理解していません。誰かがこの質問に光を当てることができますか?
9 c++  real-time 

2
これは、C ++の「pImpl」ベースのクラス階層に適したアプローチですか?
インターフェイスと実装を分離したいクラス階層があります。私の解決策は、インターフェイスのハンドルクラス階層と実装の非パブリッククラス階層の2つの階層を持つことです。基本ハンドルクラスには実装へのポインターがあり、派生ハンドルクラスは、派生型のポインターにキャストします(関数を参照getPimpl())。 これは、2つの派生クラスを持つ基本クラスの私のソリューションのスケッチです。より良い解決策はありますか? ファイル「Base.h」: #include <memory> class Base { protected: class Impl; std::shared_ptr<Impl> pImpl; Base(Impl* pImpl) : pImpl{pImpl} {}; ... }; class Derived_1 final : public Base { protected: class Impl; inline Derived_1* getPimpl() const noexcept { return reinterpret_cast<Impl*>(pImpl.get()); } public: Derived_1(...); void func_1(...) const; ... }; class Derived_2 final : …
9 design  c++  c++11 

1
Reduxの原則をOO言語に適用することには意味がありますか?
Reduxは本質的に関数型プログラミングであり、それは非常に理にかなっています。別のプロジェクトで非JavaScript OOP言語に戻ると、単一の状態オブジェクト、その状態の一部に作用するレデューサー、状態を変更するセマンティックアクションのビジネスレイヤーなどの同じ原則を適用したいと思います。 私のプロジェクトはC ++で作成されており、アプリケーションの設計に機能的で、reuxスタイルのアプローチを適用することが理にかなっているかどうかを知りたいです。このアプリではパフォーマンスはそれほど重要ではありませんが、保守性は重要です。 このようにアプリを設計するときにどのような困難に直面しますか? これはGUIアプリではないことを付け加えておきます。さらに考えてみると、アプリケーションの状態の更新による直接的な視覚効果がないため、非GUIアプリケーションでのreduxの利点が減少している可能性があります。

1
CでのC ++テンプレートタイプAPIの慣用的なラッピング
C関数でデータストア(Hazelcast)へのアクセスを提供するC ++ APIのラップに取り組んでいるため、データストアはCのみのコードからもアクセスできます。 Mapデータ構造用のHazelcast C ++ APIは次のようになります。 auto map = hazelcastClient->client->getMap<int, string>(mapName); map.put(key, value); とテンプレートのテンプレートタイプを使用keyしvalueます。Cには利用可能なテンプレートがないため、getMap<T, U>メソッドの特殊化ごとにラッパー関数を作成することを考えました。つまり、Cタイプごとに。私があることを承知しているが、signedおよびunsignedCタイプのバージョンは、私だけをサポートするAPIを制限して大丈夫だよint、double、float、char *のためにkeyとvalue。 そこで、すべての組み合わせを自動生成する小さなスクリプトを書きました。エクスポートされた関数は次のようになります。 int Hazelcast_Map_put_int_string( Hazelcast_Client_t *hazelcastClient, const char *mapName, int key, char *value, char** errptr ); int Hazelcast_Map_put_int_int( Hazelcast_Client_t *hazelcastClient, const char *mapName, int key, int value, char** errptr ); ... 機能の生成get、set、containsすべての可能な組み合わせとkeyし、value種類は非常に多くのコードの量を増加させ、そして、私はコードを生成することは良いアイデアだと思いますが、それはコード生成インフラのいくつかの種類を作成することによって、追加の複雑さを追加します。 私が想像できるもう1つのアイデアは、次のようなCの一般的な関数の1つです。 int …
9 c++  c  api-design 


5
揮発性変数を宣言するとはどういう意味ですか?
多くの低レベルのプログラムは、しかし、私は一種のそれは何にとして困惑している、メモリマッピングなどのための種類の揮発性のキーワードを使用REALLYバックグラウンドで行います。つまり、コンパイラがメモリアドレスを「最適化しない」とはどういう意味ですか?
9 c++  c  low-level 

2
インターフェース分離の原則:インターフェースに大きな重複がある場合はどうすればよいですか?
アジャイルソフトウェア開発、原則、パターン、およびプラクティス:ピアソン新国際版: 場合によっては、クライアントの異なるグループによって呼び出されるメソッドが重複することがあります。オーバーラップが小さい場合、グループのインターフェースは分離したままにする必要があります。共通の関数は、オーバーラップするすべてのインターフェースで宣言する必要があります。サーバークラスは、これらの各インターフェイスから共通の機能を継承しますが、実装するのは1回だけです。 ボブおじさんは、少しの重複がある場合について話します。 大きな重複がある場合はどうすればよいですか? 私たちは持っていると言います Class UiInterface1; Class UiInterface2; Class UiInterface3; Class UiIterface : public UiInterface1, public UiInterface2, public UiInterface3{}; 間にかなりの重複がある場合、我々は何をすべきUiInterface1とはUiInterface2?

1
C ++シリアライゼーションデザインレビュー
C ++アプリケーションを書いています。ほとんどのアプリケーションはデータ引用を読み書きする必要があり、これも例外ではありません。データモデルとシリアル化ロジックの高レベルデザインを作成しました。この質問は、これらの特定の目標を念頭に置いて、私のデザインのレビューを要求しています: 任意の形式(rawバイナリ、XML、JSONなど)でデータモデルを読み書きする簡単で柔軟な方法を提供する。al。データの形式は、シリアル化を要求しているコードと同様に、データ自体から分離する必要があります。 シリアル化が合理的に可能な限りエラーが発生しないようにするため。I / Oは、さまざまな理由で本質的にリスクが高くなります。私の設計では、失敗する方法が増えているのですか?もしそうなら、それらのリスクを軽減するために設計をどのようにリファクタリングできますか? このプロジェクトはC ++を使用します。好きでも嫌いでも、言語には独自の方法があり、デザインはその言語に対抗するのではなく、その言語で機能することを目指しています。 最後に、プロジェクトはwxWidgetsの上に構築されます。より一般的なケースに適用できるソリューションを探していますが、この特定の実装はそのツールキットでうまく機能するはずです。 以下は、C ++で記述された非常に単純なクラスのセットであり、設計を示しています。これらは私がこれまでに部分的に書いた実際のクラスではなく、このコードは私が使用しているデザインを単に示しています。 まず、いくつかのサンプルDAO: #include <iostream> #include <map> #include <memory> #include <string> #include <vector> // One widget represents one record in the application. class Widget { public: using id_type = int; private: id_type id; }; // Container for widgets. Much more than …
9 design  c++  c++11 

1
最新のC ++へのキー/バリューストア開発の移植
Cassandraに似たデータベースサーバーを開発しています。 開発はCで始まりましたが、クラスがなければ非常に複雑になりました。 現在、私はすべてをC ++ 11に移植しましたが、まだ「モダンな」C ++を学習しており、多くのことについて疑問があります。 データベースはキー/値のペアで動作します。すべてのペアにはさらに多くの情報があります。いつが作成され、いつ期限切れになるか(期限切れでない場合は0)。各ペアは不変です。 キーはC文字列、値はvoid *ですが、少なくとも今のところ、値をC文字列として操作しています。 抽象IListクラスがあります。3つのクラスから継承 VectorList -C動的配列-std :: vectorに似ていますが、 realloc LinkList -チェックとパフォーマンス比較のために作成 SkipList -最終的に使用されるクラス。 将来はRed Black木も作ろうと思います。 それぞれIListに、キーでソートされた、0個以上のペアへのポインターが含まれています。 IList長くなりすぎた場合は、特殊ファイルとしてディスクに保存できます。この特殊ファイルは一種ですread only list。 キーを検索する必要がある場合は、 最初にメモリ内IListが検索されます(SkipList、SkipListまたはLinkList)。 次に、日付でソートされたファイルに検索が送信されます (最新のファイルが最初、最も古いファイル-最後)。 これらのファイルはすべてメモリにmmapされます。 何も見つからない場合、キーは見つかりません。 私はIList物事の実装に疑いはありません。 現在私を困惑させているのは以下の通りです: ペアは異なるサイズであり、それらはによって割り当てられnew()、それらをstd::shared_ptr指し示しています。 class Pair{ public: // several methods... private: struct Blob; std::shared_ptr<const Blob> _blob; }; struct Pair::Blob{ uint64_t …

4
rand()は、狭い範囲に対して同じ数値を再び与えます
20x20のグリッドがあり、プレーヤー(P)、ターゲット(T)、3人の敵(X)を表示するようなゲームを作成しようとしています。これらはすべて、を使用して割り当てられるX座標とY座標を持っていrand()ます。問題は、ゲームでより多くのポイント(エネルギーなどのリフィル)を取得しようとすると、範囲が小さいため(1から20まで)、他のポイントの1つ以上と重複することです。 これらは私の変数であり、私はそれらを割り当てていますどのようにして値:(COORDあるstructだけでXとYとの) const int gridSize = 20; COORD player; COORD target; COORD enemy1; COORD enemy2; COORD enemy3; //generate player srand ( time ( NULL ) ); spawn(&player); //generate target spawn(&target); //generate enemies spawn(&enemy1); spawn(&enemy2); spawn(&enemy3); void spawn(COORD *point) { //allot X and Y coordinate to a point point->X = randNum(); …
9 c++  random 

4
階層を強制せずに、オブジェクトを相互に作用させて通信するにはどうすればよいですか?
これらのとりとめのない質問で私の質問が明確になることを願っています。ただし、そうでない場合は完全に理解できます。その場合はその旨をお知らせください。さらに明確にしていきます。 オブジェクト指向のゲーム開発に精通するために私が作成した非常に単純なゲームであるBoxPongに出会ってください。ボックスをドラッグしてボールを操作し、黄色い物を集めます。 BoxPongを作成することは、とりわけ、基本的な質問の策定に役立ちました。互いに「所属する」必要なしに、互いに対話するオブジェクトをどのようにして持つことができますか?言い換えれば、オブジェクトが階層的ではなく、代わりに共存する方法はありますか?(以下でさらに詳しく説明します。) オブジェクトの共存の問題はよくある問題だと思うので、解決する確立された方法があるといいのですが。私は四角いホイールを作り直したくないので、私が探している理想的な答えは「ここに、あなたの種類の問題を解決するために一般的に使用される設計パターンがある」と思います。 特にBoxPongのような単純なゲームでは、同じレベルで少数のオブジェクトが共存している、または共存している必要があることは明らかです。箱があり、ボールがあり、収集品があります。オブジェクト指向言語で表現できるのは、厳密なHAS-A関係だけですが、そうです。これは、メンバー変数を介して行われます。私は単に始めてballそれを実行させるだけではなく、永久に別のオブジェクトに属している必要があります。メインのゲームオブジェクトは、そのので、私はそれを設定した持っているボックスを、ひいてはボックスがありたボールを、そして持っているスコアカウンターを。各オブジェクトには、update()位置、方向などを計算するメソッドと同じように移動します。メインのゲームオブジェクトのupdateメソッドを呼び出します。このメソッドは、すべての子のupdateメソッドを呼び出し、次に、すべての子のupdateメソッドを呼び出します。これがオブジェクト指向のゲームを作るために私が見ることができる唯一の方法ですが、それは理想的な方法ではないと感じています。結局のところ、私はボールをボックスに属していると正確に考えるのではなく、同じレベルにいて、それと相互作用していると考えています。これは、すべてのゲームオブジェクトをメインゲームオブジェクトのメンバー変数に変換することで実現できると思いますが、何も解決しないと思います。つまり...明らかな混乱をさけて、ボールとボックスがどのようにしてがお互い知る、つまり相互作用か? また、オブジェクト間で情報を渡す必要があるという問題もあります。私はSNESのコードを書くのにかなりの経験があります。そこでは、実質的に常にRAM全体にアクセスできます。スーパーマリオワールドのカスタム敵を作成していて、マリオのコインをすべて削除して、ゼロを格納して$ 0DBFに対処したいとします。問題ありません。敵がプレイヤーのステータスにアクセスできないという制限はありません。C ++などでは、他のオブジェクト(またはグローバル)から値にアクセスできるようにする方法に疑問を感じることが多いので、私はこの自由に甘やかされていると思います。 BoxPongの例を使用して、ボールが画面の端から跳ね返るようにしたい場合はどうなりますか?widthそして、heightのプロパティであるGameクラスは、ballそれらにアクセスできるようにします。これらの種類の値を(コンストラクターまたは必要なメソッドを介して)渡すこともできますが、それは私にとって悪い習慣であるだけです。 私の主な問題は、お互いを知るためにオブジェクトが必要であるということですが、それを行うために私が見ることができる唯一の方法は、厳密な階層であり、これは醜く非実用的です。 私はC ++の「友達クラス」について聞いたことがありますが、それらがどのように機能するかは知っていますが、それらが最終的な解決策である場合、どうして表示されないのですか friendすべてのC ++プロジェクト全体にキーワードが注がれて概念はすべてのOOP言語に存在するわけではありませんか?(私が最近学んだばかりの関数ポインターについても同じことが言えます。) あらゆる種類の回答を事前にありがとう—そして、あなたに意味をなさない部分があれば、私に知らせてください。

2
例外クラスの設計
小さなライブラリをコーディングしていますが、例外処理の設計に問題があります。私はC ++言語のこの機能に(まだ)混乱していると言わざるを得ません。例外クラスを適切に処理するために何をしなければならないかを理解するために、この件について可能な限り読んでみました。 クラスのsystem_errorSTL実装からインスピレーションを得たタイプのアプローチを使用することにしましたfuture_error。 エラーコードを含む列挙があります: enum class my_errc : int { error_x = 100, error_z = 101, error_y = 102 }; そして、単一の例外クラス(error_category構造のタイプとsystem_errorモデルが必要とする他のすべてによってバックアップされます): // error category implementation class my_error_category_impl : public std::error_category { const char* name () const noexcept override { return "my_lib"; } std::string message (int ec) const override { std::string …

7
C ++の深い知識は、他の言語をより速く/より簡単に学ぶのに役立ちますか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 5年前休業。 C ++のすべての主要な側面を学び、言語の基礎をよく知っている人が、他の言語(Python、Perl、Javaなど)をより速く簡単に学ぶ可能性はありますか?
9 c++ 

5
サーバーの終了時にオブジェクトを正しく破棄する
大規模なC ++プロジェクトに取り組んでいます。REST APIを公開するサーバーで構成され、他の多くのサーバーで構成される非常に広範なシステムにシンプルでユーザーフレンドリーなインターフェースを提供します。コードベースは非常に大きく複雑であり、適切な設計を事前に行わずに時間をかけて進化しました。私の仕事は、新しいコードを実装し、古いコードをリファクタリング/修正して、より安定して信頼できるようにすることです。 現時点では、サーバーは、プロセスが終了しても終了も破棄もされない、長期間存続するオブジェクトを多数作成します。これにより、Valgrindはリーク検出にほとんど使用できなくなります。何千もの(疑わしい)正当なリークと「危険な」リークを区別することは不可能だからです。 私の考えは、すべてのオブジェクトが終了前に確実に破棄されるようにすることですが、私がこの提案をしたとき、私の同僚と上司は、OSがとにかくそのメモリを解放することを指摘し(誰にとっても明らかです)、オブジェクトを破棄することに反対しましたサーバーのシャットダウンを遅くします(現時点では、これは基本的にへの呼び出しですstd::exit)。私は、「クリーンな」シャットダウン手順を持っているからといって、それを使用しなければならないということを必ずしも意味しないと答えました。焦りを感じたらいつでも呼んでstd::quick_exitもいいしkill -9、ただプロセスを呼んでもいい。 彼らは、「ほとんどのLinuxデーモンとプロセスはシャットダウン時にわざわざメモリを解放しない」と答えました。私はそれを見ることができますが、私はすでにメモリ破損、二重解放、および初期化されていない変数を見つけたので、プロジェクトが正確なメモリデバッグを必要とすることも事実です。 あなたの考えは何ですか?私は無意味な努力を追求していますか?そうでない場合、同僚や上司をどのように説得できますか?もしそうなら、なぜ、そして代わりに私は何をすべきですか?
9 c++  debugging  memory 

6
大きなインターフェースを分割する
データベースにアクセスするために、約50のメソッドを持つ大きなインターフェースを使用しています。インターフェイスは私の同僚によって書かれました。これについて話し合いました: 私:50の方法は多すぎます。コードの匂いです。 同僚:それについて私は何をすべきか?あなたはDBアクセスを望んでいます-あなたはそれを持っています。 私:ええ、でもそれは不明確で、将来的にはメンテナンスが困難です。 同僚:わかりました、そうです、それは良くありません。インターフェイスはどのように見えるべきですか? 私:それぞれ10個のメソッドを持つオブジェクトを返す5つのメソッドはどうでしょうか? うーん、でもこれは同じでしょ?これは本当により明確になるでしょうか?努力する価値はありますか? 時々、インターフェースが必要な状況にあり、最初に頭に浮かぶのは、1つの大きなインターフェースです。これの一般的なデザインパターンはありますか? 更新(SJuanのコメントに対応): 「メソッドの種類」:データベースからデータを取得するためのインターフェースです。すべてのメソッドの形式は(疑似コード)です。 List<Typename> createTablenameList() メソッドとテーブルは厳密には1対1の関係にあるわけではなく、常にデータベースから得られるある種のリストを取得するという事実に重点が置かれています。

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