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

C ++は汎用プログラミング言語です。もともとCの拡張として設計され、構文は似ていますが、現在は完全に異なる言語になっています。このタグは、C ++コンパイラでコンパイルされる(される)コードに関する質問に使用します。特定の標準リビジョン[C ++ 11]、[C ++ 14]、[C ++ 17]または[C ++ 20]などに関連する質問には、バージョン固有のタグを使用します。

7
オーバーライドする場合は、基本クラスの仮想関数を呼び出すことができますか?
クラスがFooあり、次のBarように設定するとします。 class Foo { public: int x; virtual void printStuff() { std::cout << x << std::endl; } }; class Bar : public Foo { public: int y; void printStuff() { // I would like to call Foo.printStuff() here... std::cout << y << std::endl; } }; コードで注釈を付けたように、オーバーライドしている基本クラスの関数を呼び出せるようにしたいと思います。Javaにはsuper.funcname()構文があります。これはC ++で可能ですか?

22
2つの長方形が互いに重なり合っているかどうかを判断しますか?
ユーザーから次の入力(2〜5の間)を作成するC ++プログラムを作成しようとしています。高さ、幅、x位置、y位置。これらの長方形はすべて、x軸とy軸に平行に存在します。つまり、すべてのエッジの勾配は0または無限大になります。 私はこの質問で述べられていることを実装しようとしましたが、あまり運がありません。 私の現在の実装は次のことを行います: // Gets all the vertices for Rectangle 1 and stores them in an array -> arrRect1 // point 1 x: arrRect1[0], point 1 y: arrRect1[1] and so on... // Gets all the vertices for Rectangle 2 and stores them in an array -> arrRect2 // rotated …

14
C ++にリフレクションがないのはなぜですか?
これはやや奇妙な質問です。私の目的は、言語設計の決定を理解し、C ++での反映の可能性を特定することです。 なぜC ++言語委員会は言語でのリフレクションの実装に向かわなかったのですか?仮想マシン(Javaなど)で実行されない言語では、反射が難しすぎますか? C ++のリフレクションを実装するとしたら、どのような課題がありますか? リフレクションの使用法はよく知られていると思います。エディターをより簡単に作成でき、プログラムコードが小さくなり、単体テスト用にモックを生成できるなどです。しかし、リフレクションの使い方についてもコメントしていただければ幸いです。
337 c++  reflection 

14
C ++ 11でconstexpr機能を使用する必要があるのはいつですか?
「常に5を返す関数」を持つことは、「関数を呼び出す」という意味を壊したり弱めたりしているように思えます。理由があるか、この機能が必要であるか、C ++ 11にはないでしょう。なぜそこにあるのですか? // preprocessor. #define MEANING_OF_LIFE 42 // constants: const int MeaningOfLife = 42; // constexpr-function: constexpr int MeaningOfLife () { return 42; } 私がリテラル値を返す関数を書いて、コードレビューにたどり着いたら、誰かが私に言ったので、return 5を書く代わりに定数値を宣言する必要があります。
337 c++  c++11  constexpr 

9
外部連携と内部連携とは?
外部連携と内部連携の違いを知りたい。 の意味も知りたい constとして宣言されていない限り、変数はデフォルトで内部的にリンクしますextern。
337 c++  c++-faq 

5
std :: mapで範囲ベースのfor()ループを使用する方法
C ++ 11の範囲ベースのfor()ループの一般的な例は、常に次のような単純なものです。 std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 }; for ( auto xyz : numbers ) { std::cout << xyz << std::endl; } その場合xyzはintです。しかし、マップのようなものがあるとどうなりますか?この例の変数のタイプは何ですか? std::map< foo, bar > testing = { /*...blah...*/ }; for ( auto abc : testing ) { std::cout << abc …

17
std :: string to char *
std :: stringをchar *またはchar []データ型に変換したい。 std::string str = "string"; char* chr = str; 結果:「エラー: 『文字』から『のstd :: string』を変換することはできません...」。 これを行うにはどのような方法がありますか?
335 c++  string  char 

5
インライン名前空間とは何ですか?
C ++ 11ではinline namespacesを使用できます。s のすべてのメンバーも自動的に囲みnamespaceます。これの有用なアプリケーションは思いつきません- inline namespaceが必要であり、それが最も慣用的な解決策である状況の簡単で簡潔な例を誰かに教えてもらえますか? (また、a namespaceがinline1つの宣言で宣言されたが、すべての宣言ではなかった場合に何が起こるかは明確ではありません。これは、異なるファイルに存在する可能性があります。これは問題を起こしていませんか?)

20
int a [] = {1,2、}; 奇妙なカンマが許可されています。何か特別な理由は?
多分私はこの惑星の出身ではないかもしれませんが、以下は構文エラーであるように思えます: int a[] = {1,2,}; //extra comma in the end しかし、そうではありません。このコードがVisual Studioでコンパイルされたときは驚きましたが、C ++のルールに関してはMSVCコンパイラを信頼しないことを学んだので、標準を確認しましたが、標準でも許可されています。あなたが私を信じないなら、あなたは文法規則のために8.5.1を見ることができます。 なぜこれが許可されるのですか?これは愚かな役に立たない質問かもしれませんが、なぜ私が尋ねているのか理解して欲しいのです。それが一般的な文法規則のサブケースである場合、私は理解するだろう-彼らは、初期化子リストの末尾に冗長なコンマを許可しないために、一般的な文法をこれ以上難しくしないことに決めました。ただし、追加のコンマは明示的に許可されています。たとえば、関数呼び出しの引数リストの最後に冗長なコンマを含めることはできません(関数がを受け取る場合...)。これは正常です。 繰り返しますが、この冗長なコンマが明示的に許可されている特別な理由はありますか?


2
現代のC ++でクラシックな並べ替えアルゴリズムを実装する方法は?
std::sortアルゴリズム(そのいとこstd::partial_sortとstd::nth_elementC ++標準ライブラリからの)は、ほとんどの実装である複数の基本ソートアルゴリズムの複雑ハイブリッド融合そのような選択ソート、挿入ソート、クイックソート、マージソート、又はヒープソートなど、。 ここやhttps://codereview.stackexchange.com/などの姉妹サイトには、これらの古典的なソートアルゴリズムの実装のバグ、複雑さ、およびその他の側面に関する多くの質問があります。提供されている実装のほとんどは、生のループで構成され、インデックス操作と具象型を使用しており、正確性と効率性の観点から分析することは一般的に重要です。 質問:上記の古典的な並べ替えアルゴリズムは、最新のC ++を使用してどのように実装できますか? 生のループはありませんが、標準ライブラリのアルゴリズム構築ブロックを組み合わせて<algorithm> イテレータインターフェイスと、インデックス操作や具象型の代わりにテンプレートを使用 完全な標準ライブラリを含むC ++ 14スタイル、autoおよび、テンプレートエイリアス、透過的なコンパレータ、ポリモーフィックラムダなどの構文ノイズリデューサー。 注: ソートアルゴリズムの実装の詳細については、Wikipedia、Rosetta Code、またはhttp://www.sorting-algorithms.com/を参照してください。 ショーン親の規則(スライド39)、生のループであるforオペレータと長い2つの関数の組成より-loop。そうf(g(x));か、f(x); g(x);あるいはf(x) + g(x);生のループではありません、そしてどちらのループしているselection_sortとinsertion_sort以下。 私はスコットマイヤーズの用語に従い、現在のC ++ 1yをすでにC ++ 14として示し、C ++ 98とC ++ 03の両方をC ++ 98として示しています。 @Mehrdadのコメントで示唆されているように、回答の最後にライブ例として4つの実装を提供します。C++ 14、C ++ 11、C ++ 98、BoostおよびC ++ 98です。 答え自体はC ++ 14に関してのみ示されています。必要に応じて、さまざまな言語バージョンが異なる構文とライブラリの違いを示します。

3
0は10進数リテラルまたは8進数リテラルですか?
ゼロは常にゼロなので、それは問題ではありません。しかし、友人との最近の議論で、8進リテラルは今日ほとんど使われていないと彼は言った。†それから、コードの整数リテラルのほとんどすべてが 8進数であることがわかりました0。 ある0進リテラルは、C ++の文法に従いましたか?標準は何と言っていますか? †私が知っている唯一の実際の用途は、UNIXファイルのアクセス許可です。
329 c++  zero  octal 

10
C ++でファクトリメソッドパターンを正しく実装する方法
簡単に聞こえますが、正直に言うとどうすればいいのかわからないので、C ++には長い間不快に感じていたものが1つあります。 C ++でFactoryメソッドを正しく実装するにはどうすればよいですか? 目標:許容できない結果やパフォーマンスへの影響なしに、クライアントがオブジェクトのコンストラクタの代わりにファクトリメソッドを使用してオブジェクトをインスタンス化できるようにすること。 「ファクトリー・メソッド・パターン」とは、オブジェクト内の静的なファクトリー・メソッドまたは別のクラスで定義されたメソッド、またはグローバル関数の両方を意味します。一般的には、「クラスXのインスタンス化の通常の方法をコンストラクター以外の場所にリダイレクトするという概念」です。 私が考えたいくつかの可能な答えをざっと見てみましょう。 0)工場を作らず、コンストラクタを作る。 これは良さそうですが(実際、多くの場合は最善の解決策です)、一般的な解決策ではありません。まず、オブジェクトの構築が別のクラスへの抽出を正当化するのに十分複雑なタスクである場合があります。しかし、その事実はさておき、コンストラクターだけを使用する単純なオブジェクトの場合でさえ、多くの場合そうしません。 私が知っている最も簡単な例は、2-D Vectorクラスです。とてもシンプルですが、トリッキーです。デカルト座標と極座標の両方から構築できるようにしたいと考えています。明らかに、私はできません: struct Vec2 { Vec2(float x, float y); Vec2(float angle, float magnitude); // not a valid overload! // ... }; 私の自然な考え方は次のとおりです。 struct Vec2 { static Vec2 fromLinear(float x, float y); static Vec2 fromPolar(float angle, float magnitude); // ... }; これは、コンストラクターの代わりに、静的ファクトリーメソッドの使用につながります...これは、本質的に、何らかの方法でファクトリーパターンを実装していることを意味します(「クラスが独自のファクトリーになる」)。これは見栄えがよく(この特定のケースに適しています)、場合によっては失敗します。これについては、ポイント2で説明します。 …

22
初期化されていないローカル変数は最速の乱数ジェネレータですか?
初期化されていないローカル変数が未定義の動作(UB)であることを知っています。また、値にはトラップ表現があり、それが以降の操作に影響を与える可能性があります。ただし、乱数を視覚的表現にのみ使用し、それ以外の部分では使用しない場合もあります。たとえば、プログラムを視覚効果にランダムな色で設定します。次に例を示します。 void updateEffect(){ for(int i=0;i<1000;i++){ int r; int g; int b; star[i].setColor(r%255,g%255,b%255); bool isVisible; star[i].setVisible(isVisible); } } それよりも速いですか void updateEffect(){ for(int i=0;i<1000;i++){ star[i].setColor(rand()%255,rand()%255,rand()%255); star[i].setVisible(rand()%2==0?true:false); } } また、他の乱数ジェネレータよりも高速ですか?


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