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

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

3
デフォルト、値、ゼロの初期化の混乱
値とデフォルトとゼロの初期化について非常に混乱しています。特に、異なる標準C ++ 03とC ++ 11(およびC ++ 14)を採用する場合。 私はここで本当に良い答えを引用して拡張しようとしています値-/デフォルト-/ゼロ-初期化C ++ 98とC ++ 03誰かが記入するのを手伝ってくれるなら多くのユーザーを助けるので、それをより一般的にしますいつ何が起こるかについての概要を把握するためにギャップが必要でしたか? 一言で言えば例による完全な洞察: new演算子によって返されるメモリが初期化される場合もあれば、新しい型がPOD(単純な古いデータ)であるかどうか、またはPODメンバーを含み、を使用しているクラスであるかどうかに依存しない場合もあります。コンパイラーが生成したデフォルトのコンストラクター。 ではC ++ 1998:初期化の2種類があるゼロとデフォルトの初期化は、 C ++ 2003の初期化の3種類、値初期化を加えました。 C ++ 2011 / C ++ 2014のみリストの初期化は、添加し、そしてための規則値- / default- /ゼロ初期化は、ビットを変更しました。 仮定: struct A { int m; }; struct B { ~B(); int m; }; struct C { C() : m(){}; …
88 c++  c++11  c++14  c++03  c++98 

2
boost :: asio :: io_service実行メソッドのブロック/ブロック解除時に混乱する
Boost.Asioの完全な初心者であるため、私はと混同していio_service::run()ます。このメソッドがブロック/ブロック解除するときに誰かが私に説明してくれれば幸いです。ドキュメントには次のように記載されています。 このrun()関数は、すべての作業が終了してディスパッチするハンドラーがなくなるまで、またはio_serviceが停止するまでブロックします。 複数のスレッドがrun()関数を呼び出して、io_serviceハンドラーを実行できるスレッドのプールを設定できます。プールで待機しているすべてのスレッドは同等であり、io_serviceハンドラーを呼び出すためにそれらのいずれかを選択できます。 run()関数の通常の終了は、io_serviceオブジェクトが停止していることを意味します(stopped()関数はtrueを返します)。後続の呼び出しはするrun()、run_one()、poll()またはpoll_one()前のコールがない限り、すぐに戻りますreset()。 次のステートメントはどういう意味ですか? [...]ディスパッチされるハンドラーはもうありません[...] の動作を理解しようとしているときにio_service::run()、この例(例3a)に出くわしました。その中で、私はそれio_service->run()が作業指示をブロックして待つのを観察します。 // WorkerThread invines io_service->run() void WorkerThread(boost::shared_ptr<boost::asio::io_service> io_service); void CalculateFib(size_t); boost::shared_ptr<boost::asio::io_service> io_service( new boost::asio::io_service); boost::shared_ptr<boost::asio::io_service::work> work( new boost::asio::io_service::work(*io_service)); // ... boost::thread_group worker_threads; for(int x = 0; x < 2; ++x) { worker_threads.create_thread(boost::bind(&WorkerThread, io_service)); } io_service->post( boost::bind(CalculateFib, 3)); io_service->post( boost::bind(CalculateFib, 4)); io_service->post( boost::bind(CalculateFib, 5)); work.reset(); …
88 c++  boost-asio 

5
std :: shared_ptrに相当する非アトミックなものはありますか?そして、なぜ<memory>にないのですか?
これは、次の原子性に関する2つの部分からなる質問ですstd::shared_ptr。 1. 私が知る限り、それはアトミックstd::shared_ptrな唯一のスマートポインター&lt;memory&gt;です。std::shared_ptr利用可能な非アトミックバージョンがあるかどうか疑問に思っています(何も表示されない&lt;memory&gt;ので、Boostのような標準外の提案も受け付けています)。boost::shared_ptrアトミックでもあることは知っていますが(BOOST_SP_DISABLE_THREADS定義されていない場合)、別の選択肢があるのでしょうか?と同じセマンティクスを持つstd::shared_ptrが、原子性がないものを探しています。 2.なぜstd::shared_ptrアトミックなのか理解しています。ちょっといいです。ただし、すべての状況に適しているわけではなく、C ++には、歴史的に「使用した分だけ支払う」というマントラがありました。複数のスレッドを使用していない場合、または複数のスレッドを使用しているがスレッド間でポインターの所有権を共有していない場合、アトミックスマートポインターはやり過ぎです。私の2番目の質問は、なぜ非アトミックバージョンのstd::shared_ptrがC ++ 11で提供されなかったのかということです。(理由があると仮定して)(答えが単に「非アトミックバージョンは単に考慮されなかった」または「誰も非アトミックバージョンを要求したことがない」である場合は問題ありません!) 質問#2で、誰かがshared_ptr(Boostまたは標準化委員会のいずれかに)の非アトミックバージョンを提案したことがあるかどうか疑問に思っています(のアトミックバージョンを置き換えるのでshared_ptrはなく、それと共存するために)そしてそれは特定の理由。

14
C ++:列挙値をテキストとして出力します
このような列挙型がある場合 enum Errors {ErrorA=0, ErrorB, ErrorC}; 次に、コンソールに印刷したい Errors anError = ErrorA; cout&lt;&lt;anError;/// 0 will be printed しかし、私が欲しいのはテキスト「ErrorA」です。if/ switchを使用せずにそれを行うことはできますか? そして、これに対するあなたの解決策は何ですか?
88 c++  enums 


5
共有ポインタを引数として渡す
共有ポインタでラップされたオブジェクトを宣言すると、次のようになります。 std::shared_ptr&lt;myClass&gt; myClassObject(new myClass()); それから私はそれをメソッドへの引数として渡したいと思いました: DoSomething(myClassObject); //the called method void DoSomething(std::shared_ptr&lt;myClass&gt; arg1) { arg1-&gt;someField = 4; } 上記は単にshared_ptの参照カウントをインクリメントするだけで、すべてがクールですか?それとも、ダングリングポインタを残しますか? あなたはまだこれをすることになっていますか?: DoSomething(myClassObject.Get()); void DoSomething(std::shared_ptr&lt;myClass&gt;* arg1) { (*arg1)-&gt;someField = 4; } (スマートポインタ全体ではなく)1つのアドレスをコピーするだけでよいため、2番目の方法の方が効率的かもしれないと思いますが、1番目の方法の方が読みやすく、パフォーマンスの制限を押し上げることはないと思います。危険なものがないことを確認したいだけです。 ありがとうございました。

3
DLLから関数を動的にロードします
私は.dllファイルを少し見ていて、それらの使用法を理解していて、それらの使用方法を理解しようとしています。 funci()という名前の整数を返す関数を含む.dllファイルを作成しました このコードを使用して、私は.dllファイルをプロジェクトにインポートしました(苦情はありません): #include &lt;windows.h&gt; #include &lt;iostream&gt; int main() { HINSTANCE hGetProcIDDLL = LoadLibrary("C:\\Documents and Settings\\User\\Desktop \\fgfdg\\dgdg\\test.dll"); if (hGetProcIDDLL == NULL) { std::cout &lt;&lt; "cannot locate the .dll file" &lt;&lt; std::endl; } else { std::cout &lt;&lt; "it has been called" &lt;&lt; std::endl; return -1; } int a = funci(); return …
88 c++  winapi  dll 

7
std :: vector <AbstractClass>を宣言できないのはなぜですか?
C#での開発にかなりの時間を費やした後、インターフェイスとして使用する目的で抽象クラスを宣言すると、この抽象クラスのベクトルをインスタンス化して子クラスのインスタンスを格納できないことに気付きました。 #pragma once #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; class IFunnyInterface { public: virtual void IamFunny() = 0; }; class FunnyImpl: IFunnyInterface { public: virtual void IamFunny() { cout &lt;&lt; "&lt;INSERT JOKE HERE&gt;"; } }; class FunnyContainer { private: std::vector &lt;IFunnyInterface&gt; funnyItems; }; 抽象クラスのベクトルを宣言する行により、MSVS2005で次のエラーが発生します。 error C2259: 'IFunnyInterface' : cannot …


5
コピーコンストラクターでプライベート変数にアクセスできるのはなぜですか?
クラス内のget関数を使用するだけで、プライベート変数にアクセスできないことを学びました。しかし、なぜコピーコンストラクターでアクセスできるのでしょうか。 例: Field::Field(const Field&amp; f) { pFirst = new T[f.capacity()]; pLast = pFirst + (f.pLast - f.pFirst); pEnd = pFirst + (f.pEnd - f.pFirst); std::copy(f.pFirst, f.pLast, pFirst); } 私の宣言: private: T *pFirst,*pLast,*pEnd;


5
C ++:名前空間—ヘッダーファイルとソースファイルで正しく使用する方法は?
インターフェイス宣言ファイル(*.hまたは*.hpp)とその実装ファイル(*.cpp)の2つのソースファイルのペアについて考えてみます。 ましょ*.hファイルは、以下のようになります: namespace MyNamespace { class MyClass { public: int foo(); }; } ソースファイルで名前空間を使用するための2つの異なる方法を見てきました。 *.cpp 練習#1を示す: #include "MyClass.h" using namespace MyNamespace; int MyClass::foo() { ... } *.cpp 練習#2を示す: #include "MyClass.h" namespace MyNamespace { int MyClass::foo() { ... } } 私の質問:これら2つのプラクティスの間に違いはあり、一方が他方よりも優れていると見なされますか?

1
派生*からベース*への変換は存在しますが、アクセスできません
cが構造体であり、デフォルトでパブリック継承があるのに、次のコードでこのエラーが発生するのはなぜですか? struct c { protected: int i; public: c(int ii=0):i(ii){} virtual c *fun(); }; c* c::fun(){ cout&lt;&lt;"in c"; return &amp;c(); } class d : c { public: d(){} d* fun() { i = 9; cout&lt;&lt;"in d"&lt;&lt;'\t'&lt;&lt;i; return &amp;d(); } }; int main() { c *cc; d dd; cc = &amp;dd; …
88 c++  inheritance 

2
テンプレートクラスメンバー関数の明示的な特殊化
あるタイプ(たとえばdouble)のテンプレートメンバー関数を特殊化する必要があります。クラスX自体がテンプレートクラスではない場合は正常に機能しますが、テンプレートにすると、GCCがコンパイル時エラーを出し始めます。 #include &lt;iostream&gt; #include &lt;cmath&gt; template &lt;class C&gt; class X { public: template &lt;class T&gt; void get_as(); }; template &lt;class C&gt; void X&lt;C&gt;::get_as&lt;double&gt;() { } int main() { X&lt;int&gt; x; x.get_as(); } これがエラーメッセージです source.cpp:11:27: error: template-id 'get_as&lt;double&gt;' in declaration of primary template source.cpp:11:6: error: prototype for 'void X&lt;C&gt;::get_as()' does not …

2
gcc / g ++:「そのようなファイルやディレクトリはありません」
g++ 次の形式のエラーが表示されます。 foo.cc:&lt;line&gt;:&lt;column&gt;: fatal error: &lt;bar&gt;: No such file or directory compilation terminated. を使用してCプログラムをコンパイルする場合も同じgccです。 何故ですか? 注意:この質問はこれまで何度も質問されてきましたが、そのたびに質問者の状況に固有のものでした。この質問の目的は、他の人が、一度限りの複製として閉じることができるという質問をすることです。よくある質問。
88 c++  c  gcc  g++  c++-faq 

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