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

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

2
GCCはC ++自体で記述されているため、鶏と卵の問題はありませんか?
4.8リリース以降、C ++コンパイラGCC(そのG ++部分)は、CではなくC ++自体で記述されています。これについて架空の質問があります。 まだC ++コンパイラがない新しいプラットフォームでGCCのC ++コードをコンパイルする方法を知りたいです。もちろん、他のマシンでコンパイルされたビルド済みのバイナリを使用することもできます。または、Cで書かれた古いバージョンのGCCを使用して、現在のバージョンをコンパイルすることもできます。 しかし、ビルド済みのバイナリがなく、最新バージョンがないと、行き詰まっていましたよね?そうでない場合、GCCプロジェクトのCからC ++への切り替えによって引き起こされるこの状況に他の影響がありますか?
10 c++  compiler  gcc 

1
C ++での移動セマンティクス-ローカル変数のMove-Return
私の理解では、C ++ 11では、関数からローカル変数を値で返す場合、コンパイラーはその変数をr値参照として扱い、それを関数から「移動」して返すことができます(もちろん、RVO / NRVOは代わりに発生しません)。 私の質問は、これは既存のコードを壊すことができないのですか? 次のコードを検討してください。 #include <iostream> #include <string> struct bar { bar(const std::string& str) : _str(str) {} bar(const bar&) = delete; bar(bar&& other) : _str(std::move(other._str)) {other._str = "Stolen";} void print() {std::cout << _str << std::endl;} std::string _str; }; struct foo { foo(bar& b) : _b(b) {} ~foo() …
10 c++  c++11 

3
C ++:C ++機能ではなくコンパイラAPIを使用したメタプログラミング
これはSOの質問として始まりましたが、それはかなり型破りであり、Webサイト上の実際の説明に基づくと、質問には多くの概念的な重みがあるため、programmers.seに適している可能性があることに気付きました。 私はclang LibToolingを学習してきましたが、これは非常に強力なツールであり、コードの「ぎこちない」全体をフレンドリーな方法で、つまりセマンティックな方法で、推測することなく公開できます。clangがコードをコンパイルできる場合、clangはそのコード内のすべての単一文字のセマンティクスについて確実です。 ここで、少し前に戻ります。 C ++テンプレートのメタプログラミングに従事する場合(特に、恐ろしいマクロではあるが、テンプレートを超えて賢い領域に冒険する場合)には、多くの実用的な問題が発生します。正直なところ、私も含めて多くのプログラマーにとって、テンプレートの通常の使用法の多くは、やや恐ろしいものです。 良い例は、コンパイル時の文字列だと思います。これは、1年以上前の質問ですが、現時点でのC ++では、これが単なる人間にとって容易ではないことは明らかです。これらのオプションを見るだけでは吐き気を誘発するのに十分ではありませんが、それでも、私が自分のソフトウェアで使用している空想のアプリケーションに適合する魔法の、最大限に効率的なマシンコードを生成できるかどうか自信がありません。 正直言って、皆さん、文字列はかなりシンプルで基本的なものです。私たちの中には、特定の文字列が単純な方法でコーディングする場合よりも大幅に「組み込まれた」マシンコードを生成する便利な方法を求めているだけです。私たちのC ++コードで。 clangとLibToolingを入力します。これにより、ソースコードの抽象構文ツリー(AST)が公開され、シンプルなカスタムC ++アプリケーションRewriterが、ASTのすべての豊富なセマンティックオブジェクト指向モデルと一緒に、生のソースコードを(確実に)正しく正確に操作できるようになります。それは多くのものを扱います。マクロ展開について知っているので、それらのチェーンをたどることができます。はい、私はソースからソースへのコード変換または変換について話しています。 ここでの私の基本的な論点は、clangにより、C ++ソフトウェアの理想的なカスタムプリプロセッサステージとして機能する実行可能ファイルを作成できるようになり、これらのメタプログラミングステージをC ++で実装できるということです。このステージは、有効なC ++コードである入力を受け取り、より有効なC ++コードを出力として生成する必要があるという事実に制約されます。さらに、ビルドシステムが適用するその他の制約。 結局のところ、clangはコンパイラのフロントエンドであり、APIを使って独創的であるため、入力は少なくとも有効なC ++コードに非常に近い必要があります。使用する新しい構文を定義できるようにする準備があるかどうかはわかりませんが、これを正しく解析してclangプロジェクトに追加する方法を開発する必要があることは明らかです。これ以上期待することは、clangプロジェクトに範囲外の何かを含めることです。 問題ない。一部の何もしないマクロ関数がこのタスクを処理できると思います。 私が説明していることを確認する別の方法は、言語自体で利用できるより限定されたツールを使用して実装する代わりに、ソースコードのAST(clangとそのAPIのおかげ)を操作することにより、ランタイムC ++を使用してメタプログラミング構成を実装することです。これには、明らかなコンパイルパフォーマンスの利点もあります(テンプレートが多いヘッダーでは、使用頻度に比例してコンパイルが遅くなります。コンパイルされたものの多くは、慎重に照合され、リンカーによって破棄されます)。 ただし、これには、ビルドプロセスに追加の手順を1つまたは2つ追加するコストと、ツールの一部として(確かに)多少冗長なソフトウェア(ただし、少なくとも単純なランタイムC ++)を記述する必要があります。 。 それは全体像ではありません。コア言語の機能では非常に困難または不可能であるコードを生成することで、はるかに大きな機能空間を確保できると確信しています。C ++ではテンプレート、マクロ、またはその両方のクレイジーな組み合わせを記述できますが、clangツールでは、セマンティックコンテンツへのフルアクセスを持ちながら、実行時に C ++で実現できる方法でクラスと関数を変更できます。テンプレートとマクロ、その他すべてに加えて。 それで、なぜ誰もがまだこれをしていないのかと思っています。clangのこの機能は非常に新しく、clangのASTの巨大なクラス階層に誰も精通していないのでしょうか?それはそれではありえない。 おそらく、私はこれの難しさを少し過小評価しているだけですが、clangツールを使用して「コンパイル時の文字列操作」を行うことは、犯罪的にほぼ単純です。冗長ですが、非常に単純です。必要なのは、実際の実際のstd::string操作にマップする一連のno-opマクロ関数だけです。clangプラグインは、関連するすべてのno-opマクロ呼び出しをフェッチしてこれを実装し、文字列を使用して操作を実行します。このツールは、ビルドプロセスの一部として挿入されます。ビルド中に、これらのno-opマクロ関数呼び出しは自動的にその結果に評価され、プログラム内の単純な古いコンパイル時文字列として挿入されます。その後、プログラムは通常どおりコンパイルできます。実際、結果として得られるこのプログラムは、結果としてはるかに移植性が高くなり、C ++ 11をサポートする豪華な新しいコンパイラーを必要としません。

4
ライブラリの分離を可能にしながら、多態性動作の設計パターン
Itemクラスの階層があるとしましょう:Rectangle, Circle, Triangle。それらを描画できるようにしたいので、私の最初の可能性はDraw()それぞれに仮想メソッドを追加することです: class Item { public: virtual ~Item(); virtual void Draw() =0; }; ただし、コアライブラリには基本的な表現しか含まれていないのに、描画機能を別のDrawライブラリに分割したいと思います。私が考えることができるいくつかの可能性があります: 1-のDrawManagerリストを受け取り、何をすべきかを計算Itemするdynamic_cast<>ために使用する必要がある: class DrawManager { void draw(ItemList& items) { FOREACH(Item* item, items) { if (dynamic_cast<Rectangle*>(item)) { drawRectangle(); } else if (dynamic_cast<Circle*>(item)) { drawCircle(); } .... } } }; これはRTTIに依存し、1つのクラスが階層内のすべての項目を認識するように強制するため、理想的ではありません。 2-もう1つのアプローチは、描画の責任をItemDrawer階層に任せることです(RectangleDrawerなど)。 class Item { virtual Drawer* GetDrawer() …

3
データベースアクセスをカプセル化するにはどうすればよいですか?
データベースアクセスの管理に使用される適切なクラス構造の例は何ですか?私はクラスカプセル化のファンであり、データベースタスクを実行しないようにコンテナ(車など)を好みます。 また、将来的にはデータベースキャッシュなどを簡単にドロップできる機能も必要です。 私はしばしば、単一のシングルトンクラスによって実行される検証とデータベースアクセスのためのゲッターとセッターを備えたコンテナークラスのパターンを採用しています。そうは言っても、これはしばしば2つの間で混合され、かなり混乱します。 私の質問が理解しにくい場合は申し訳ありません。データベースに関する条件については、はっきりとはわかりません。必要に応じて、遠慮なく説明を求めてください。
10 c++  database 

1
「C ++テンプレート:完全ガイド」(c)2002 — C ++ 11で最新ですか?
『C ++ Templates:The Complete Guide』(c)2002は非常に魅力的に見えますが、12歳なので、古くなっているのではないかと心配しています。最近1年前の非常に好意的なAmazonレビューがいくつかあり、C ++テンプレートに他の最近のタイトルはありません。2002年に発行されたテンプレートに関する本(特にSTLに関する本ではなく)に、たとえばC ++ 11によって置き換えられたり、追加されたりした構文や概念があるかどうかは誰にもわかりますか? 以下はアマゾンの本の説明からです: テンプレートはC ++の最も強力な機能の1つですが、無視されたり、誤解されたり、誤用されたりすることがよくあります。C ++テンプレート:コンプリートガイドは、テンプレートを使用して、よりクリーンで、より高速で、よりスマートなソフトウェアをより効率的に構築および維持する理由、時期、および方法を明確に理解することをソフトウェアアーキテクトおよびエンジニアに提供します。 C ++テンプレートは、基本的な概念と言語機能に関する洞察に満ちたチュートリアルから始まります。本の残りの部分は、最初に言語の詳細に焦点を当て、次に幅広いコーディング手法に焦点を当て、最後にテンプレートの高度なアプリケーションに焦点を当てた包括的なリファレンスとして機能します。本全体で使用されている例は、抽象的な概念を示し、ベストプラクティスを示しています。 読者は学ぶ テンプレートの正確な動作 テンプレートに関連する落とし穴を回避する方法 イディオムとテクニック、基本的なものから以前に文書化されていないものまで パフォーマンスや安全性を脅かすことなくソースコードを再利用する方法 C ++プログラムの効率を上げる方法 より柔軟で保守可能なソフトウェアを作成する方法
10 c++  templates 

7
CとC ++のコードを混在させるべきではないと思います。これは問題ですか、どのように修正しますか?
背景/シナリオ 純粋にCでCLIアプリケーションの作成を開始しました(「Hello World」またはそのバリエーションではない、最初の適切なCまたはC ++プログラム)。途中でユーザー入力(文字配列)の「文字列」を操作していて、C ++文字列ストリーマーオブジェクトを発見しました。これらを使用してコードを保存できることがわかったので、アプリケーションで使用しました。これは、ファイル拡張子を.cppに変更し、g++ではなくでアプリをコンパイルしたことを意味しますgcc。これに基づいて、私はアプリケーションが技術的にC ++アプリケーションであると言います(ただし、コードの90%以上はCと呼ばれるもので記述されていますが、二つ)。これは、約900行の単一の.cppファイルです。 重要な要素 私はプログラムを無料で(お金のように)自由に配布し、すべての人が使用できるようにしたいと考えています。私の懸念は、誰かがコードを見て、以下の影響について何かを考えることです: ああコーディングを見て、それはひどいです、このプログラムは私を助けることができません 潜在的にそれができるとき!もう1つの問題は、コードが効率的であることです(イーサネット接続をテストするためのプログラムです)。アプリケーションやその出力のパフォーマンスを著しく妨げるほど非効率なコードの部分があってはなりません。ただし、特定の関数、メソッド、オブジェクト呼び出しなどのヘルプを求めるときのスタックオーバーフローの問題だと思います。 私の質問 (私の意見では)CとC ++を混在させるべきではないのですが。それをすべてC ++で書き直そうとする必要がありますか(これにより、新しいC ++テクニックを使用して圧縮できるCスタイルで何かをコーディングした可能性があるC ++オブジェクトとメソッドを実装することを意味します)、または文字列ストリーマーオブジェクトとすべてをCコードに「戻し」ますか?ここに正しいアプローチはありますか?私は迷っていて、このアプリケーションを大衆の目に「良い」状態に保つ方法についてのガイダンスが必要です。大衆の目には、それを使用して利益を得るでしょう。 コード-更新 ここにコードへのリンクがあります。約40%のコメントです。流暢になるまで、ほぼすべての行にコメントします。ただし、リンクしたコピーでは、ほとんどすべてのコメントが削除されています。これで読みづらくならないことを願っています。誰もがそれを完全に理解する必要がないことを望んでいます。致命的な設計上の欠陥を作った場合でも、それらを簡単に識別できることを願っています。また、Ubuntuデスクトップとラップトップをいくつか書いています。コードを他のオペレーティングシステムに移植するつもりはありません。
10 c++  c 

5
ライブラリとしてgccを使用する方法はありますか?
誰でも次のように機能するソリューションを知っています。 #include <stdio.h> #include <gcc.h> /* This .h is what I'm looking for. */ int main (void) { /* variables declaration (...) */ /* The following line is supposed to be equivalent to: * $ gcc main.c -o main */ results = gcc_compile_and_link("main.c", "main"); /* Now I want to use …
10 c++  c  gcc 

4
C ++とMySQLでWebアプリを構築することには、概念的な欠点がありますか?
私は、非常に興味深いプロジェクトを継承しました。このプロジェクトでは、既存のソフトウェアを取得してSaaS Webアプリに変換する良い機会があります。プロジェクトが継承されるため、コードベース/フレームワークはすでにC ++およびMySQLとして定義されています。アプリ自体がコンパイルされ、Windows Server上でEXEとして実行されます。UIはWebベースであり、アプリは一種のサーバーとして機能します。私が最近のWebアプリについて知っていることから、これはおそらく珍しい選択です。最近では、ほとんどの人がPHPフレームワークまたはRuby on Railsを選択しているようです。確かにそれは私がこの主題についてブログを読んで得た印象です。それで、MySQLに裏打ちされたC ++ EXEがWebアプリの強固な基盤であるかどうか、または別の方法でビルドする必要があるかどうかを知りたいと思います。

5
インターフェースと継承:両方の長所?
私はインターフェースを「発見」し、それらを愛するようになりました。インターフェイスの優れた点は、それがコントラクトであることであり、そのコントラクトを満たすオブジェクトは、そのインターフェイスが必要な場所であればどこでも使用できます。 インターフェースの問題は、それがデフォルトの実装を持つことができないことです。これは、ありふれたプロパティの苦痛であり、DRYを無効にします。これは、実装とシステムの分離を維持するため、これも良い方法です。一方、継承はより緊密な結合を維持し、カプセル化を壊す可能性があります。 ケース1(プライベートメンバーによる継承、適切なカプセル化、密結合) class Employee { int money_earned; string name; public: void do_work(){money_earned++;}; string get_name(return name;); }; class Nurse : public Employee: { public: void do_work(/*do work. Oops, can't update money_earned. Unaware I have to call superclass' do_work()*/); }; void HireNurse(Nurse *n) { nurse->do_work(); ) ケース2(単なるインターフェース) class IEmployee { virtual …

5
プリプロセッサディレクティブまたはif(定数)ステートメントを使用する方が良いですか?
多くの異なる衣装に使用されるコードベースがあり、タイプXの衣装にのみ関連するいくつかのコードがあるとします。このコードをタイプXの衣装にのみ含めるには、プリプロセッサディレクティブを使用する方が良いですか、またはifステートメントを使用するには?より明確にするために: // some code #if TYPE_X_COSTUMER = 1 // do some things #endif // rest of the code または if(TYPE_X_COSTUMER) { // do some things } 私が考えることができる引数は次のとおりです。 プリプロセッサディレクティブにより、コードフットプリントが小さくなり、ブランチが少なくなります(最適化されていないコンパイラでは) ステートメントが常にコンパイルされるコードで発生する場合、たとえば、誰かが間違いを犯して、彼が取り組んでいるプロジェクトの無関係なコードに悪影響を与える場合でも、エラーは表示され、コードベースは破損しません。そうでなければ、彼は腐敗に気づかないでしょう。 私は常に、プリプロセッサーの使用よりもプロセッサーの使用を優先するように言われました(これがまったく議論の場合...) 何が望ましいですか-多くの異なる衣装のコードベースについて話すとき?
10 c++  c 

4
ソートされた浮動小数点数の配列を検索して、入力値を囲んでいる浮動小数点数のペアを見つける高速アルゴリズム
フロートの配列があり、最小から最大にソートされており、渡された入力値よりも大きいまたは小さい最も近いフロートを選択できる必要があります。この入力値は、必ずしも配列内の値として存在するわけではありません。 素朴なアプローチは、配列全体で単純な線形検索を行うことです。次のようになります。 void FindClosestFloatsInArray( float input, std::vector<float> array, float *min_out, float *max_out ) { assert( input >= array[0] && input < array[ array.size()-1 ] ); for( int i = 1; i < array.size(); i++ ) { if ( array[i] >= input ) { *min = array[i-1]; *max = array[i]; } …
10 c++  algorithms 


9
チェスの駒の継承と構成
このstackexchangeを簡単に検索すると、一般的に構成は継承よりも柔軟であると一般に考えられていますが、常にプロジェクトなどに依存し、継承の方が適している場合があります。3Dチェスゲームを作りたいのですが、各ピースにはメッシュがあり、場合によっては異なるアニメーションなどがあります。この具体的な例では、両方のアプローチのケースが間違っていると主張できるように思われますか? 継承は次のようになります(適切なコンストラクターなどを使用) class BasePiece { virtual Squares GetValidMoveSquares() = 0; Mesh* mesh; // Other fields } class Pawn : public BasePiece { Squares GetValidMoveSquares() override; } これは確かに「is-a」の原則に従いますが、構成は次のようになります。 class MovementComponent { virtual Squares GetValidMoveSquares() = 0; } class PawnMovementComponent { Squares GetValidMoveSquares() override; } enum class Type { PAWN, BISHOP, //etc …

2
dynamic_castの使用を回避するための適切な設計?
いくつかの調査を行った後、私が頻繁に遭遇する問題を解決する簡単な例を見つけることができないようです。 Squares、Circles、およびその他の形状を作成し、画面に表示し、それらを選択した後でそれらのプロパティを変更して、すべての周囲を計算できる小さなアプリケーションを作成したいとします。 私はこのようなモデルクラスを行います: class AbstractShape { public : typedef enum{ SQUARE = 0, CIRCLE, } SHAPE_TYPE; AbstractShape(SHAPE_TYPE type):m_type(type){} virtual ~AbstractShape(); virtual float computePerimeter() const = 0; SHAPE_TYPE getType() const{return m_type;} protected : const SHAPE_TYPE m_type; }; class Square : public AbstractShape { public: Square():AbstractShape(SQUARE){} ~Square(); void setWidth(float w){m_width = w;} …

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