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

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

8
แลมบ์ดาจับภาพอ้างอิง const
มันเป็นไปได้ที่จะจับโดยอ้างอิง const ในการแสดงออกแลมบ์ดา? ฉันต้องการให้การบ้านที่ระบุไว้ด้านล่างล้มเหลวตัวอย่างเช่น: #include <cstdlib> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { string strings[] = { "hello", "world" }; static const size_t num_strings = sizeof(strings)/sizeof(strings[0]); string best_string = "foo"; for_each( &strings[0], &strings[num_strings], [&best_string](const string& s) { best_string = s; // this should fail } …
166 c++  c++11  lambda  c++14 

14
วิธีแก้ไขข้อผิดพลาดฮีปเสียหาย
ฉันกำลังดีบักแอปพลิเคชัน C + + แบบหลายเธรดแบบเธรดภายใต้ Visual Studio 2008 ในโอกาสที่สุ่มฉันได้รับข้อผิดพลาด "Windows เรียกจุดพัก ... " ด้วยข้อผิดพลาดที่อาจเกิดจากการทุจริตใน กอง. ข้อผิดพลาดเหล่านี้จะไม่ทำให้แอปพลิเคชันหยุดทำงานทันทีแม้ว่าจะมีความผิดพลาดหลังจากนั้นก็ตาม ปัญหาใหญ่ของข้อผิดพลาดเหล่านี้คือเกิดขึ้นหลังจากความเสียหายเกิดขึ้นจริงซึ่งทำให้ยากต่อการติดตามและตรวจแก้จุดบกพร่องโดยเฉพาะอย่างยิ่งในแอปพลิเคชันแบบมัลติเธรด สิ่งใดที่ทำให้เกิดข้อผิดพลาดเหล่านี้ได้บ้าง ฉันจะดีบักได้อย่างไร ยินดีต้อนรับเคล็ดลับเครื่องมือวิธีการ enlightments ...
166 c++  windows  debugging  heap 

2
การระบุ“ การกระโดดหรือย้ายตามเงื่อนไขขึ้นอยู่กับข้อความที่ไม่ได้เตรียมค่า” valgrind
ดังนั้นฉันจึงได้รับข้อความที่ไม่ได้กำหนดค่าเริ่มต้นจาก valgrind และมันค่อนข้างลึกลับซึ่งเป็นที่มาของค่าที่ไม่ดี ดูเหมือนว่า valgrind แสดงให้เห็นถึงสถานที่ที่มีการใช้ค่า unitialised แต่ไม่ใช่ที่มาของค่าเริ่มต้น ==11366== Conditional jump or move depends on uninitialised value(s) ==11366== at 0x43CAE4F: __printf_fp (in /lib/tls/i686/cmov/libc-2.7.so) ==11366== by 0x43C6563: vfprintf (in /lib/tls/i686/cmov/libc-2.7.so) ==11366== by 0x43EAC03: vsnprintf (in /lib/tls/i686/cmov/libc-2.7.so) ==11366== by 0x42D475B: (within /usr/lib/libstdc++.so.6.0.9) ==11366== by 0x42E2C9B: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > …
166 c++  valgrind 

1
ฟังก์ชั่นสมาชิกคงที่ข้อผิดพลาด; วิธีการเขียนลายเซ็นอย่างถูกต้อง?
ฉันได้รับข้อผิดพลาดเมื่อพยายามรวบรวมรหัสของฉันใน g ++ โดยใช้ลายเซ็นปัจจุบัน: cannot declare member function static void Foo::Bar(std::ostream&, const Foo::Node*) to have static linkage คำถามของฉันคือสองเท่า: ทำไมมันไม่คอมไพล์ด้วยวิธีนี้? ลายเซ็นที่ถูกต้องคืออะไรและเพราะเหตุใด ลายเซ็นเป็นความตายของฉันเมื่อใช้ C ++ แก้ไข: นี่คือไฟล์ส่วนหัวของชั้นเรียนเช่นกัน: class Foo { public: Foo(); ~Foo(); bool insert(const Foo2 &v); Foo * find(const Foo2 &v); const Foo * find(const Foo2 &v) const; void output(ostream &s) …

9
เหตุใดความผันผวนจึงไม่ถือว่ามีประโยชน์ในการเขียนโปรแกรม C หรือ C ++ แบบมัลติเธรด
ดังที่แสดงในคำตอบที่ฉันเพิ่งโพสต์เมื่อเร็ว ๆ นี้ดูเหมือนว่าฉันจะสับสนเกี่ยวกับยูทิลิตี้ (หรือขาดของมัน) volatileในบริบทการเขียนโปรแกรมแบบมัลติเธรด volatileความเข้าใจของฉันนี้เวลาใดตัวแปรอาจมีการเปลี่ยนแปลงนอกไหลของการควบคุมของชิ้นส่วนของรหัสเข้าถึงมันว่าตัวแปรที่ควรได้รับการประกาศให้เป็น ตัวจัดการสัญญาณการลงทะเบียน I / O และตัวแปรที่แก้ไขโดยเธรดอื่นทั้งหมดล้วนเป็นสถานการณ์ดังกล่าว ดังนั้นถ้าคุณมี int ส่วนกลางfooและfooถูกอ่านโดยหนึ่งเธรดและตั้งค่าเป็นอะตอมต่อโดยเธรดอื่น (อาจใช้คำสั่งเครื่องที่เหมาะสม) เธรดการอ่านจะเห็นสถานการณ์นี้ในแบบเดียวกับที่มันเห็นตัวแปร tweaked โดยตัวจัดการสัญญาณหรือ แก้ไขโดยเงื่อนไขฮาร์ดแวร์ภายนอกและดังนั้นจึงfooควรประกาศvolatile(หรือสำหรับสถานการณ์แบบมัลติเธรดเข้าถึงได้ด้วยโหลดหน่วยความจำไม่พอใจซึ่งน่าจะเป็นทางออกที่ดีกว่า) ฉันผิดและอยู่ที่ไหน

7
เหตุใดฉันจึงต้องประกาศตัวทำลายเสมือนสำหรับคลาสนามธรรมใน C ++
ฉันรู้ว่ามันเป็นแนวปฏิบัติที่ดีในการประกาศ destructors เสมือนจริงสำหรับคลาสพื้นฐานใน C ++ แต่เป็นสิ่งสำคัญเสมอที่จะประกาศvirtualdestructors แม้สำหรับคลาสนามธรรมที่ทำหน้าที่เป็นอินเตอร์เฟสหรือไม่ โปรดระบุเหตุผลและตัวอย่างว่าทำไม

11
pImpl สำนวนที่ใช้จริงในการปฏิบัติจริง
ฉันกำลังอ่านหนังสือ "เจ๋ง C ++" โดย Herb Sutter และในหนังสือเล่มนั้นฉันได้เรียนรู้เกี่ยวกับสำนวน pImpl โดยพื้นฐานแล้วความคิดคือการสร้างโครงสร้างสำหรับprivateวัตถุของclassและจัดสรรแบบไดนามิกเพื่อลดเวลาในการรวบรวม (และซ่อนการใช้งานส่วนตัวในลักษณะที่ดีกว่า) ตัวอย่างเช่น: class X { private: C c; D d; } ; สามารถเปลี่ยนเป็น: class X { private: struct XImpl; XImpl* pImpl; }; และใน CPP คำจำกัดความ: struct X::XImpl { C c; D d; }; ดูเหมือนว่าจะน่าสนใจ แต่ฉันไม่เคยเห็นวิธีการนี้มาก่อนทั้งใน บริษัท ที่ฉันเคยทำงานหรือในโครงการโอเพ่นซอร์สที่ฉันเคยเห็นซอร์สโค้ด ดังนั้นฉันสงสัยว่าเทคนิคนี้ใช้ในทางปฏิบัติจริง ๆ หรือไม่ …
165 c++  oop  pimpl-idiom 

11
ลบตัวชี้ไปยังคลาสย่อยหรือไม่เรียกตัวทำลายคลาสพื้นฐานหรือไม่
ฉันมีอันclass Aที่ใช้การจัดสรรหน่วยความจำฮีปสำหรับหนึ่งในฟิลด์ของมัน คลาส A ถูกสร้างและเก็บเป็นฟิลด์ตัวชี้ในคลาสอื่น ( class B. เมื่อฉันทำกับวัตถุของคลาส B ฉันเรียกdeleteซึ่งฉันคิดว่าเรียกว่า destructor ... แต่สิ่งนี้เรียกว่า destructor ของคลาส A ด้วยหรือไม่ แก้ไข: จากคำตอบที่ฉันใช้ (โปรดแก้ไขหากไม่ถูกต้อง): delete ของอินสแตนซ์ของ B เรียก B :: ~ B (); สายไหน A::~A(); A::~A ควรdeleteกำหนดตัวแปรสมาชิกที่จัดสรรฮีปทั้งหมดของวัตถุ A อย่างชัดเจน ในที่สุดการจัดเก็บหน่วยความจำบล็อกกล่าวว่าตัวอย่างของการเรียน B จะถูกส่งกลับไปยังกอง - เมื่อใหม่ถูกนำมาใช้เป็นครั้งแรกที่จัดสรรบล็อกของหน่วยความจำบนกองก่อสร้างแล้วเรียกเพื่อเริ่มต้นมันตอนนี้หลังจาก destructors ทั้งหมดได้รับการเรียกเพื่อจบวัตถุ บล็อกที่วัตถุที่อยู่จะถูกส่งกลับไปยังกอง

9
มีการแทนที่สำหรับ unistd.h สำหรับ Windows (Visual C) หรือไม่
ฉันกำลังย้ายโปรแกรมคอนโซลที่ค่อนข้างง่ายซึ่งเขียนขึ้นสำหรับ Unix ไปยังแพลตฟอร์ม Windows ( Visual C ++ 8.0 ) ไฟล์ต้นฉบับทั้งหมดมี "unistd.h" ซึ่งไม่มีอยู่ การลบออกฉันได้รับการร้องเรียนเกี่ยวกับการพลาดต้นแบบสำหรับ 'srandom', 'random' และ 'getopt' ฉันรู้ว่าฉันสามารถแทนที่ฟังก์ชั่นแบบสุ่มและฉันค่อนข้างมั่นใจว่าฉันสามารถค้นหา / แฮ็กอัพการใช้งาน getopt แต่ฉันแน่ใจว่าคนอื่น ๆ ได้พบกับความท้าทายเดียวกัน คำถามของฉันคือ: มีพอร์ต "unistd.h" กับ Windows หรือไม่ อย่างน้อยหนึ่ง containg ฟังก์ชั่นเหล่านั้นที่มีการใช้งาน Windows พื้นเมือง - ฉันไม่ต้องการท่อหรือฟอร์ก แก้ไข : ฉันรู้ว่าฉันสามารถสร้าง "unistd.h" ของตัวเองซึ่งมีการแทนที่สิ่งที่ฉันต้องการ - โดยเฉพาะในกรณีนี้เนื่องจากเป็นชุดที่ จำกัด แต่เนื่องจากดูเหมือนว่าเป็นปัญหาทั่วไปฉันจึงสงสัยว่ามีบางคนทำงานให้ฟังก์ชั่นย่อยที่ใหญ่กว่านี้อยู่แล้ว การสลับไปใช้คอมไพเลอร์หรือสภาพแวดล้อมที่แตกต่างกันเป็นไปไม่ได้ในที่ทำงาน - ฉันติดอยู่กับ …
165 c++  c  windows  portability  unistd.h 

3
ทำไมฉันควรหลีกเลี่ยง std :: enable_if ในฟังก์ชันลายเซ็น
Scott Meyers โพสต์เนื้อหาและสถานะของหนังสือเล่มต่อไปของเขา EC ++ 11 เขาเขียนว่าหนึ่งรายการในหนังสือเล่มนี้อาจจะ"หลีกเลี่ยงการstd::enable_ifอยู่ในลายเซ็นฟังก์ชั่น" std::enable_if สามารถใช้เป็นอาร์กิวเมนต์ฟังก์ชั่นเป็นประเภทผลตอบแทนหรือเป็นแม่แบบชั้นเรียนหรือพารามิเตอร์แม่แบบฟังก์ชั่นเพื่อลบฟังก์ชั่นหรือคลาสจากเงื่อนไขการแก้ไขเกินพิกัด ในคำถามนี้จะแสดงคำตอบทั้งสาม พารามิเตอร์ฟังก์ชั่น: template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if< std::is_same<U, int>::value >::type* = 0) { return 42; } template<typename U = T> U read(typename std::enable_if< std::is_same<U, double>::value >::type* = 0) { return 3.14; } }; เป็นพารามิเตอร์เทมเพลต: …

3
วัตถุประสงค์ C ++ คืออะไร [ปิด]
เป็นการยากที่จะบอกสิ่งที่ถูกถามที่นี่ คำถามนี้คลุมเครือคลุมเครือไม่สมบูรณ์กว้างเกินไปหรือโวหารและไม่สามารถตอบได้อย่างสมเหตุสมผลในรูปแบบปัจจุบัน สำหรับความช่วยเหลือในการทำความเข้าใจคำถามนี้เพื่อที่จะสามารถเปิด, ไปที่ศูนย์ช่วยเหลือ ปิดให้บริการใน7 ปีที่ผ่านมา Objective C ++ คืออะไรและฉันสามารถใช้ภาษานี้ใน Xcode ได้อย่างไร

11
วิธีการแปลง enum ที่พิมพ์โดยเฉพาะอย่างยิ่งเป็น int
#include <iostream> struct a { enum LOCAL_A { A1, A2 }; }; enum class b { B1, B2 }; int foo(int input) { return input; } int main(void) { std::cout << foo(a::A1) << std::endl; std::cout << foo(static_cast<int>(b::B2)) << std::endl; } นี่a::LOCAL_Aคือสิ่งที่ enum ที่พิมพ์อย่างรุนแรงพยายามที่จะบรรลุ แต่มีความแตกต่างเล็กน้อย: enums ปกติสามารถแปลงเป็นประเภทจำนวนเต็มได้ในขณะที่ enums ที่พิมพ์อย่างรุนแรงไม่สามารถทำได้โดยไม่ต้องใช้นักแสดง ดังนั้นมีวิธีการแปลงค่า enum …

15
ในทางปฏิบัติทำไมคอมไพเลอร์ที่ต่างกันจึงคำนวณค่า int x = ++ i + ++ i ต่างกัน?
พิจารณารหัสนี้: int i = 1; int x = ++i + ++i; เรามีการคาดเดาว่าคอมไพเลอร์อาจทำอะไรกับโค้ดนี้โดยสมมติว่าคอมไพเลอร์ ทั้ง++iผลตอบแทนที่เกิดใน2x=4 หนึ่งใน++iผลตอบแทน2และผลตอบแทนอื่น ๆ ที่มีผลในการ3x=5 ทั้ง++iผลตอบแทนที่เกิดใน3x=6 สำหรับฉันอย่างที่สองดูเหมือนจะเป็นไปได้มากที่สุด หนึ่งในสอง++ตัวดำเนินการถูกดำเนินการด้วยi = 1ค่าที่iเพิ่มขึ้นและผลลัพธ์2จะถูกส่งกลับ จากนั้นตัว++ดำเนินการที่สองจะถูกดำเนินการด้วยi = 2ค่าที่iเพิ่มขึ้นและผลลัพธ์3จะถูกส่งกลับ แล้ว2และมีการเพิ่มเข้าด้วยกันเพื่อให้35 แต่ผมวิ่งรหัสนี้ใน Visual Studio 6และผลที่ได้ก็คือ ฉันพยายามทำความเข้าใจคอมไพเลอร์ให้ดีขึ้นและฉันสงสัยว่าอะไรอาจนำไปสู่ผลลัพธ์ของ6ไฟล์. ฉันเดาเพียงอย่างเดียวคือโค้ดสามารถทำงานพร้อมกัน "ในตัว" บางอย่างได้ สอง++ผู้ประกอบการถูกเรียกว่าแต่ละคนเพิ่มขึ้นก่อนที่จะกลับมาอีกแล้วพวกเขาทั้งสองกลับi 3สิ่งนี้จะขัดแย้งกับความเข้าใจของฉันเกี่ยวกับ call stack และจำเป็นต้องอธิบายออกไป สิ่งใด (ที่สมเหตุสมผล) ที่C++คอมไพเลอร์สามารถทำได้ซึ่งจะนำไปสู่ผลลัพธ์4หรือผลลัพธ์หรือ6? บันทึก ตัวอย่างนี้เป็นตัวอย่างของพฤติกรรมที่ไม่ได้กำหนดไว้ในการเขียนโปรแกรมของ Bjarne Stroustrup: หลักการและการปฏิบัติโดยใช้ C ++ (C ++ …

12
ไม่เคยเห็นมาก่อน C ++ สำหรับลูป
ฉันกำลังแปลงอัลกอริทึม C ++ เป็น C # ฉันเจอสิ่งนี้เพื่อการวนซ้ำ: for (u = b.size(), v = b.back(); u--; v = p[v]) b[u] = v; มันไม่มีข้อผิดพลาดใน C ++ แต่ทำใน C # (ไม่สามารถแปลง int เป็น bool) ฉันไม่สามารถหาสิ่งนี้สำหรับลูป, เงื่อนไขอยู่ที่ไหน ใครช่วยอธิบายหน่อยได้ไหม? PS เพียงตรวจสอบเพื่อปรับ VECTOR ให้เข้ากับรายการ b.back () สอดคล้องกับ b [b.Count-1] หรือไม่
164 c#  c++  for-loop 

20
“ สำหรับ (;;)” เร็วกว่า“ ขณะ (TRUE)” หรือไม่ ถ้าไม่ทำไมผู้คนถึงใช้มัน?
for (;;) { //Something to be done repeatedly } ฉันเคยเห็นสิ่งต่าง ๆ นี้ใช้บ่อย แต่ฉันคิดว่ามันค่อนข้างแปลก ... มันจะไม่ชัดเจนกว่าที่จะพูดwhile(true)หรือบางสิ่งบางอย่างตามสายเหล่านั้น? ฉันเดาว่า (เช่นเดียวกับเหตุผลที่โปรแกรมเมอร์หลายคนหันไปใช้รหัสลับ) นี่เป็นอัตรากำไรขั้นต้นที่น้อยกว่าหรือไม่ ทำไมและมันคุ้มค่าจริงหรือ ถ้าเป็นเช่นนั้นทำไมไม่กำหนดเพียงวิธีนี้: #define while(true) for(;;) ดูเพิ่มเติม: อันไหนเร็วกว่าในขณะที่ (1) หรือขณะที่ (2)?

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