คำถามติดแท็ก c++

C ++ เป็นภาษาโปรแกรมทั่วไป เดิมได้รับการออกแบบให้เป็นส่วนขยายของ C และมีไวยากรณ์ที่คล้ายกัน แต่ตอนนี้มันเป็นภาษาที่แตกต่างอย่างสิ้นเชิง ใช้แท็กนี้สำหรับคำถามเกี่ยวกับรหัส (จะ) คอมไพล์ด้วยคอมไพเลอร์ C ++ ใช้แท็กเฉพาะรุ่นสำหรับคำถามที่เกี่ยวข้องกับการแก้ไขมาตรฐานเฉพาะ [C ++ 11], [C ++ 14], [C ++ 17] หรือ [C ++ 20] เป็นต้น

5
ไฟล์. h.gch คืออะไร
ฉันเพิ่งมีโปรเจ็กต์คลาสที่ฉันต้องทำโปรแกรมด้วย G ++ ฉันใช้ makefile และบางครั้งก็ทิ้งไฟล์. h.gch ไว้ข้างหลังด้วยเหตุผลบางประการ บางครั้งสิ่งนี้ไม่ได้ส่งผลต่อการคอมไพล์ แต่บ่อยครั้งที่คอมไพเลอร์ออกข้อผิดพลาดสำหรับปัญหาที่ได้รับการแก้ไขแล้วหรือไม่สมเหตุสมผล ฉันมีสองคำถาม: 1) ไฟล์. h.gch คืออะไรและใช้ทำอะไร และ 2) เหตุใดจึงเกิดปัญหาเช่นนี้เมื่อไม่ได้ทำความสะอาด
116 c++  g++ 

4
หลีกเลี่ยงคำสั่ง if ภายใน for loop หรือไม่?
ฉันมีคลาสที่เรียกWriterว่ามีฟังก์ชันwriteVectorดังนี้: void Drawer::writeVector(vector<T> vec, bool index=true) { for (unsigned int i = 0; i < vec.size(); i++) { if (index) { cout << i << "\t"; } cout << vec[i] << "\n"; } } ฉันพยายามไม่ให้มีรหัสซ้ำในขณะที่ยังคงกังวลเกี่ยวกับประสิทธิภาพ ในฟังก์ชั่นฉันทำการif (index)ตรวจสอบทุกรอบของfor-loop แม้ว่าผลลัพธ์จะเหมือนกันเสมอ ซึ่งถือเป็นการ "กังวลเกี่ยวกับประสิทธิภาพการทำงาน" ฉันสามารถหลีกเลี่ยงสิ่งนี้ได้อย่างง่ายดายโดยวางเช็คไว้ด้านนอกfor-loop ของฉัน อย่างไรก็ตามฉันจะได้รับรหัสซ้ำมากมาย: void Drawer::writeVector(...) { if (index) { for …

5
มีตัวถอดรหัส C ++ หรือไม่? [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน3 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันมีโปรแกรมที่ฉันทำซอร์สโค้ด C ++ หาย มีตัวถอดรหัส C ++ ที่ดีหรือไม่? ฉันวิ่งข้ามบูมเมอแรงแล้ว

8
การเริ่มต้น std :: vector สองมิติ
ดังนั้นฉันมีสิ่งต่อไปนี้: std::vector< std::vector <int> > fog; และฉันกำลังเริ่มต้นมันอย่างไร้เดียงสาเช่น: for(int i=0; i<A_NUMBER; i++) { std::vector <int> fogRow; for(int j=0; j<OTHER_NUMBER; j++) { fogRow.push_back( 0 ); } fog.push_back(fogRow); } และรู้สึกผิดมาก ... มีวิธีการเริ่มต้นเวกเตอร์แบบนี้อีกหรือไม่?
116 c++  vector 

4
ความแตกต่างระหว่าง `const shared_ptr <T>` และ `shared_ptr <const T>`?
ฉันกำลังเขียนวิธีการเข้าถึงสำหรับตัวชี้ที่ใช้ร่วมกันใน C ++ ซึ่งมีลักษณะดังนี้: class Foo { public: return_type getBar() const { return m_bar; } private: boost::shared_ptr&lt;Bar&gt; m_bar; } ดังนั้นเพื่อรองรับ const-ness ของgetBar()ประเภทการส่งคืนควรเป็นสิ่งboost::shared_ptrที่ป้องกันการแก้ไขที่Barชี้ไป ฉันเดาว่าshared_ptr&lt;const Bar&gt;เป็นประเภทที่ฉันต้องการกลับไปทำเช่นนั้นในขณะที่const shared_ptr&lt;Bar&gt;จะป้องกันไม่ให้การกำหนดตัวชี้ซ้ำเพื่อชี้ไปยังตำแหน่งอื่นBarแต่อนุญาตให้แก้ไขสิ่งBarที่ชี้ไป ... อย่างไรก็ตามฉันไม่แน่ใจ ฉันจะขอบคุณมากถ้ามีคนที่รู้แน่ชัดสามารถยืนยันเรื่องนี้หรือแก้ไขฉันได้หากฉันเข้าใจผิด ขอบคุณ!
116 c++  boost  const  shared-ptr 

8
จะตรวจสอบเวอร์ชันของมาตรฐาน C ++ ที่คอมไพเลอร์ใช้อย่างไร?
คุณจะทราบได้อย่างไรว่าคอมไพเลอร์ของคุณใช้มาตรฐาน C ++ เวอร์ชันใด เท่าที่ฉันรู้ด้านล่างนี้คือมาตรฐานที่ฉันรู้จัก: C ++ 03 C ++ 98
116 c++  standards 

5
ไดเร็กทอรีเอาต์พุต / สร้าง CMake
ฉันค่อนข้างใหม่สำหรับ CMake และอ่านบทแนะนำเกี่ยวกับวิธีการใช้งานและเขียนสคริปต์ CMake ที่ซับซ้อน 50 บรรทัดเพื่อสร้างโปรแกรมสำหรับคอมไพเลอร์ 3 ตัว นี่อาจเป็นการสรุปความรู้ทั้งหมดของฉันใน CMake ตอนนี้ปัญหาของฉันคือฉันมีซอร์สโค้ดซึ่งมีโฟลเดอร์ที่ฉันไม่ต้องการสัมผัส / ยุ่งกับเมื่อฉันสร้างโปรแกรม ฉันต้องการให้ CMake และmakeเอาท์พุตไฟล์และโฟลเดอร์ทั้งหมดเข้ามา../Compile/ดังนั้นฉันจึงเปลี่ยนตัวแปรสองสามตัวในสคริปต์ CMake ของฉันสำหรับสิ่งนั้นและมันก็ใช้ได้ในบางครั้งเมื่อฉันทำสิ่งนี้บนแล็ปท็อปของฉัน: Compile$ cmake ../src Compile$ make โดยที่ฉันมีผลลัพธ์ที่สะอาดในโฟลเดอร์ที่ฉันอยู่ตอนนี้ซึ่งเป็นสิ่งที่ฉันกำลังมองหา ตอนนี้ฉันย้ายไปที่คอมพิวเตอร์เครื่องอื่นและคอมไพล์ CMake 2.8.11.2 ใหม่และฉันเกือบจะกลับไปที่สี่เหลี่ยมจัตุรัส! มันมักจะรวบรวมสิ่งนั้นไว้ในsrcโฟลเดอร์ที่ฉันCMakeLists.txtอยู่ ส่วนที่ฉันเลือกไดเร็กทอรีในสคริปต์ CMake ของฉันคือ: set(dir ${CMAKE_CURRENT_SOURCE_DIR}/../Compile/) set(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE) set(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY …
116 c++  build  makefile  cmake  output 

5
เหตุใดฉันจึงไม่สามารถเริ่มต้นสมาชิกแบบคงที่ที่ไม่ใช่ const หรืออาร์เรย์แบบคงที่ในคลาสได้
เหตุใดฉันจึงไม่สามารถเริ่มต้นstaticสมาชิกที่ไม่ใช่ const หรือstaticอาร์เรย์ในคลาสได้ class A { static const int a = 3; static int b = 3; static const int c[2] = { 1, 2 }; static int d[2] = { 1, 2 }; }; int main() { A a; return 0; } คอมไพเลอร์ออกข้อผิดพลาดต่อไปนี้: g++ main.cpp main.cpp:4:17: error: ISO C++ …
116 c++  static  const 

8
คำแนะนำเฉพาะระบบปฏิบัติการใน CMAKE: ทำอย่างไร?
ฉันเป็นมือใหม่กับ CMAKE ด้านล่างนี้เป็นไฟล์ cmake แบบธรรมดาซึ่งทำงานได้ดีในหน้าต่างสภาพแวดล้อม mingw ปัญหาชัดเจนกับtarget_link_libraries()ฟังก์ชันของ CMAKE ที่ฉันเชื่อมโยง libwsock32.a ใน windows สิ่งนี้ใช้งานได้และฉันได้รับผลลัพธ์ อย่างไรก็ตามตามที่คาดไว้ใน Linux /usr/bin/ldจะมองหา-lwsock32สิ่งที่ไม่มีใน Linux OS ปัญหาของฉันคือ: ฉันจะสั่งให้ CMAKE หลีกเลี่ยงการเชื่อมโยงไลบรารี wsock32 ใน Linux OS ได้อย่างไร ??? ความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมาก ไฟล์ Simple CMake ของฉัน: PROJECT(biourl) set (${PROJECT_NAME}_headers ./BioSocketAddress.h ./BioSocketBase.h ./BioSocketBuffer.h ./BioSocketCommon.h ./BioSocketListener.h ./BioSocketPrivate.h ./BioSocketStream.h ./BioUrl.h BioDatabase.h ) set (${PROJECT_NAME}_sources …
116 c++  linux  cmake  mingw  portability 

4
วิธีโอเวอร์โหลด std :: swap ()
std::swap()ถูกใช้โดยคอนเทนเนอร์มาตรฐานจำนวนมาก (เช่นstd::listและstd::vector) ในระหว่างการเรียงลำดับและแม้กระทั่งการกำหนด แต่การนำ std ไปใช้swap()นั้นเป็นแบบทั่วไปและค่อนข้างไม่มีประสิทธิภาพสำหรับประเภทที่กำหนดเอง ดังนั้นประสิทธิภาพจะได้รับจากการโอเวอร์โหลดstd::swap()ด้วยการใช้งานเฉพาะประเภทที่กำหนดเอง แต่คุณจะใช้มันได้อย่างไรเพื่อให้ std container ใช้?


4
ใน C ++ ถ้า throw คือนิพจน์ประเภทของมันคืออะไร?
ฉันเลือกสิ่งนี้ในการโจมตีสั้น ๆ ของฉันเพื่อ reddit: http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/ โดยทั่วไปผู้เขียนชี้ให้เห็นว่าใน C ++: throw "error" คือการแสดงออก นี่เป็นการสะกดที่ชัดเจนในมาตรฐาน C ++ ทั้งในข้อความหลักและไวยากรณ์ อย่างไรก็ตามสิ่งที่ไม่ชัดเจน (สำหรับฉันอย่างน้อยที่สุด) คือประเภทของนิพจน์คืออะไร? ฉันเดาว่า " void" แต่การทดลองเล็กน้อยกับ g ++ 4.4.0 และ Comeau ให้รหัสนี้: void f() { } struct S {}; int main() { int x = 1; const char * p1 = x == 1 …
115 c++  throw 

17
C ++ - ส่งต่อการอ้างอิงไปยัง std :: shared_ptr หรือ boost :: shared_ptr
ถ้าฉันมีฟังก์ชันที่ต้องทำงานร่วมกับ a shared_ptrมันจะไม่มีประสิทธิภาพมากกว่าที่จะส่งต่อการอ้างอิงไปยังมัน (เพื่อหลีกเลี่ยงการคัดลอกshared_ptrวัตถุ) ผลข้างเคียงที่ไม่ดีที่เป็นไปได้คืออะไร? ฉันนึกภาพสองกรณีที่เป็นไปได้: 1) ภายในฟังก์ชันมีสำเนาของอาร์กิวเมนต์เช่นใน ClassA::take_copy_of_sp(boost::shared_ptr&lt;foo&gt; &amp;sp) { ... m_sp_member=sp; //This will copy the object, incrementing refcount ... } 2) ภายในฟังก์ชันจะใช้อาร์กิวเมนต์เท่านั้นเช่นใน Class::only_work_with_sp(boost::shared_ptr&lt;foo&gt; &amp;sp) //Again, no copy here { ... sp-&gt;do_something(); ... } ฉันไม่เห็นเหตุผลที่ดีในทั้งสองกรณีที่จะส่งผ่านboost::shared_ptr&lt;foo&gt;ค่าโดยแทนที่จะเป็นการอ้างอิง การส่งผ่านตามค่าจะเพิ่มจำนวนอ้างอิง "ชั่วคราว" เนื่องจากการคัดลอกและลดลงเมื่อออกจากขอบเขตฟังก์ชัน ฉันมองข้ามบางสิ่งไปหรือเปล่า? เพียงเพื่อชี้แจงหลังจากอ่านคำตอบหลาย ๆ ข้อ: ฉันเห็นด้วยอย่างสมบูรณ์เกี่ยวกับข้อกังวลเกี่ยวกับการปรับให้เหมาะสมก่อนเวลาอันควรและฉันมักจะพยายามสร้างจุดเริ่มต้นจากนั้นทำงานบนฮอตสปอต คำถามของฉันมาจากมุมมองของโค้ดทางเทคนิคล้วนๆถ้าคุณรู้ว่าฉันหมายถึงอะไร

7
จะสร้าง std :: string จาก std :: vector <char> ได้อย่างไร?
สั้น ๆ (ที่ชัดเจน) การสร้างสตริงสไตล์ C ก่อนจากนั้นจึงใช้สิ่งนั้นเพื่อสร้างสตริง std :: มีวิธีที่เร็วกว่า / ทางเลือก / "ดีกว่า" ในการเริ่มต้นสตริงจากเวกเตอร์ของอักขระหรือไม่?
115 c++ 

4
จะระบุแพลตฟอร์ม / คอมไพเลอร์จากมาโครตัวประมวลผลล่วงหน้าได้อย่างไร
ฉันกำลังเขียนโค้ดข้ามแพลตฟอร์มซึ่งควรรวบรวมที่ linux, windows, Mac OS บน windows ฉันต้องรองรับ visual studio และ mingw มีโค้ดเฉพาะแพลตฟอร์มบางส่วนซึ่งฉันควรวางไว้ใน#ifdef .. #endifสภาพแวดล้อม ตัวอย่างเช่นที่นี่ฉันวางรหัสเฉพาะของ win32: #ifdef WIN32 #include &lt;windows.h&gt; #endif แต่ฉันจะรู้จัก linux และ mac OS ได้อย่างไร ฉันควรใช้ชื่ออะไร (หรืออื่น ๆ )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.