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

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

10
ACE vs Boost vs POCO [ปิดแล้ว]
ปิด . คำถามนี้เป็นคำถามความคิดเห็นตาม ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบได้ด้วยข้อเท็จจริงและการอ้างอิงโดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันทำงานกับBoost C ++ Librariesมาระยะหนึ่งแล้ว ฉันชอบไลบรารี Boost Asio C ++สำหรับการเขียนโปรแกรมเครือข่าย อย่างไรก็ตามผมได้แนะนำให้รู้จักกับสองห้องสมุดอื่น ๆ : POCOและการปรับเปลี่ยนการสื่อสารสิ่งแวดล้อมกรอบ (ACE) ฉันต้องการทราบความดีและความเลวของแต่ละ

5
การสืบทอดเสมือนช่วยแก้ความคลุมเครือของ "เพชร" (มรดกหลายรายการ) ได้อย่างไร
class A { public: void eat(){ cout<<"A";} }; class B: virtual public A { public: void eat(){ cout<<"B";} }; class C: virtual public A { public: void eat(){ cout<<"C";} }; class D: public B,C { public: void eat(){ cout<<"D";} }; int main(){ A *a = new D(); a->eat(); } ฉันเข้าใจปัญหาเพชรและส่วนข้างบนของรหัสไม่มีปัญหานั้น …

13
การยกเลิกการเชื่อมโยงผลลัพธ์ของ std :: type_info :: name
ฉันกำลังทำงานกับรหัสบันทึกบางอย่างที่ควรจะพิมพ์ข้อมูลเกี่ยวกับฟังก์ชันการโทร สิ่งนี้ควรจะค่อนข้างง่าย C ++ มาตรฐานมีtype_infoคลาส ซึ่งมีชื่อของ typeid'd class / function / etc แต่มันแหลกเหลว มันไม่มีประโยชน์มาก คือtypeid(std::vector<int>).name()ผลตอบแทนSt6vectorIiSaIiEE. มีวิธีการผลิตสิ่งที่เป็นประโยชน์จากสิ่งนี้หรือไม่? เช่นเดียวstd::vector<int>กับตัวอย่างข้างต้น หากใช้ได้เฉพาะกับคลาสที่ไม่ใช่เทมเพลตก็ใช้ได้เช่นกัน วิธีแก้ปัญหาควรใช้ได้กับ gcc แต่จะดีกว่าถ้าฉันสามารถพอร์ตได้ สำหรับการบันทึกจึงไม่สำคัญมากจนไม่สามารถปิดได้ แต่ควรมีประโยชน์สำหรับการดีบัก
97 c++  gcc  name-mangling 

3
เมื่อใดควรใช้ตัวเริ่มต้นที่ปิดด้วยปีกกา
ใน C ++ 11 เรามีไวยากรณ์ใหม่สำหรับการเริ่มต้นคลาสซึ่งทำให้เรามีความเป็นไปได้มากมายในการเริ่มต้นตัวแปร { // Example 1 int b(1); int a{1}; int c = 1; int d = {1}; } { // Example 2 std::complex<double> b(3,4); std::complex<double> a{3,4}; std::complex<double> c = {3,4}; auto d = std::complex<double>(3,4); auto e = std::complex<double>{3,4}; } { // Example 3 std::string a(3,'x'); std::string …


4
เวกเตอร์ถูกส่งผ่านไปยังฟังก์ชันตามค่าหรือโดยการอ้างอิงใน C ++
ฉันกำลังเขียนโค้ดใน C ++ ถ้าฉันมีฟังก์ชันบางอย่างvoid foo(vector<int> test)และฉันเรียกมันในโปรแกรมของฉันเวกเตอร์จะถูกส่งต่อด้วยค่าหรือการอ้างอิงหรือไม่? ฉันไม่แน่ใจเพราะฉันรู้ว่าเวกเตอร์และอาร์เรย์มีความคล้ายคลึงกันและฟังก์ชันที่ต้องการvoid bar(int test[])จะผ่านการทดสอบโดยการอ้างอิง (ตัวชี้?) แทนที่จะเป็นค่า ฉันเดาว่าฉันจะต้องส่งเวกเตอร์ด้วยตัวชี้ / การอ้างอิงอย่างชัดเจนหากฉันต้องการหลีกเลี่ยงการส่งผ่านค่า แต่ฉันไม่แน่ใจ
97 c++  arrays  vector 

2
การใช้งานแลมด้า C ++ 11 และโมเดลหน่วยความจำ
ฉันต้องการข้อมูลเกี่ยวกับวิธีการคิดอย่างถูกต้องเกี่ยวกับการปิด C ++ 11 และstd::functionในแง่ของวิธีการใช้งานและวิธีจัดการหน่วยความจำ แม้ว่าฉันจะไม่เชื่อในการเพิ่มประสิทธิภาพก่อนกำหนด แต่ฉันก็มีนิสัยในการพิจารณาผลกระทบด้านประสิทธิภาพของตัวเลือกของฉันอย่างรอบคอบในขณะที่เขียนโค้ดใหม่ ฉันยังเขียนโปรแกรมแบบเรียลไทม์ในปริมาณพอสมควรเช่นในไมโครคอนโทรลเลอร์และสำหรับระบบเสียงซึ่งต้องหลีกเลี่ยงการจัดสรรหน่วยความจำแบบไม่กำหนด / การหยุดการจัดสรร ดังนั้นฉันจึงต้องการพัฒนาความเข้าใจให้ดีขึ้นว่าเมื่อใดควรใช้หรือไม่ใช้ C ++ lambdas ความเข้าใจปัจจุบันของฉันคือแลมด้าที่ไม่มีการปิดจับนั้นเหมือนกับการเรียกกลับ C อย่างไรก็ตามเมื่อสภาพแวดล้อมถูกจับด้วยค่าหรือโดยการอ้างอิงอ็อบเจ็กต์ที่ไม่ระบุชื่อจะถูกสร้างขึ้นบนสแต็ก std::functionเมื่อมูลค่าปิดต้องถูกส่งกลับจากฟังก์ชั่นหนึ่งใน wraps จะเกิดอะไรขึ้นกับหน่วยความจำการปิดในกรณีนี้? คัดลอกจากสแต็กไปยังฮีปหรือไม่ เป็นอิสระเมื่อใดก็ตามที่std::functionเป็นอิสระกล่าวคือมีการนับการอ้างอิงเหมือน a std::shared_ptrหรือไม่? ฉันคิดว่าในระบบเวลาจริงฉันสามารถตั้งค่าฟังก์ชั่นห่วงโซ่ของแลมบ์ดาผ่าน B เป็นอาร์กิวเมนต์ต่อเนื่องไปเพื่อให้ท่อการประมวลผลA->Bจะถูกสร้างขึ้น ในกรณีนี้การปิด A และ B จะถูกจัดสรรครั้งเดียว แม้ว่าฉันไม่แน่ใจว่าสิ่งเหล่านี้จะถูกจัดสรรบนสแต็กหรือฮีป อย่างไรก็ตามโดยทั่วไปดูเหมือนว่าปลอดภัยที่จะใช้ในระบบเรียลไทม์ ในทางกลับกันถ้า B สร้างฟังก์ชันแลมบ์ดาบางฟังก์ชัน C ซึ่งส่งคืนหน่วยความจำสำหรับ C จะได้รับการจัดสรรและจัดสรรซ้ำ ๆ ซึ่งจะไม่เป็นที่ยอมรับสำหรับการใช้งานแบบเรียลไทม์ ในรหัสหลอกคือ DSP loop ซึ่งฉันคิดว่าจะปลอดภัยแบบเรียลไทม์ ฉันต้องการประมวลผลบล็อก A และ …
97 c++  memory  lambda  c++11 

7
ฉันจะหาข้อยกเว้นใน C ++ ได้อย่างไร
ฉันมีโปรแกรมที่แสดงข้อยกเว้นที่ไม่ถูกจับได้ที่ไหนสักแห่ง สิ่งที่ฉันได้รับคือรายงานว่ามีการโยนข้อยกเว้นและไม่มีข้อมูลว่ามีการโยนทิ้งไปที่ใด ดูเหมือนว่าไม่มีเหตุผลสำหรับโปรแกรมที่คอมไพล์มีสัญลักษณ์การดีบักที่จะไม่แจ้งให้ฉันทราบว่ามีการสร้างข้อยกเว้นในโค้ดของฉันที่ใด มีวิธีใดบ้างที่จะบอกได้ว่าข้อยกเว้นของฉันมาจากการไม่ตั้งค่า 'catch throw' ใน gdb และเรียก backtrace สำหรับข้อยกเว้นการโยนทุกครั้ง

4
จะตรวจสอบประเภทของพารามิเตอร์เทมเพลตได้อย่างไร?
สมมติว่าฉันมีฟังก์ชันเทมเพลตและสองคลาส class animal { } class person { } template<class T> void foo() { if (T is animal) { kill(); } } ฉันจะตรวจสอบ T คือสัตว์ได้อย่างไร? ฉันไม่ต้องการให้มีบางอย่างที่ตรวจสอบระหว่างเวลาทำงาน ขอบคุณ
97 c++  templates 

7
ฉันจะส่ง std :: unique_ptr ไปยังฟังก์ชันได้อย่างไร
ฉันจะส่งผ่านstd::unique_ptrเข้าสู่ฟังก์ชันได้อย่างไร? บอกว่าฉันมีคลาสต่อไปนี้: class A { public: A(int val) { _val = val; } int GetVal() { return _val; } private: int _val; }; ต่อไปนี้ไม่ได้รวบรวม: void MyFunc(unique_ptr<A> arg) { cout << arg->GetVal() << endl; } int main(int argc, char* argv[]) { unique_ptr<A> ptr = unique_ptr<A>(new A(1234)); MyFunc(ptr); return 0; } เหตุใดฉันจึงไม่สามารถส่งผ่านstd::unique_ptrเข้าสู่ฟังก์ชันได้ …
97 c++  c++11  unique-ptr 

1
ข้อผิดพลาด: อาร์กิวเมนต์เริ่มต้นที่กำหนดสำหรับพารามิเตอร์ 1
ฉันได้รับข้อความแสดงข้อผิดพลาดพร้อมรหัสด้านล่าง: class Money { public: Money(float amount, int moneyType); string asString(bool shortVersion=true); private: float amount; int moneyType; }; ก่อนอื่นฉันคิดว่าไม่อนุญาตให้ใช้พารามิเตอร์เริ่มต้นเป็นพารามิเตอร์แรกใน C ++ แต่ได้รับอนุญาต

6
ตัวดำเนินการทิลเดอร์ใน C
ฉันเคยเห็นตัวดำเนินการตัวหนอนที่ใช้ในอัลกอริทึมการแฮชของ ELF และฉันก็อยากรู้ว่ามันทำอะไร (รหัสมาจาก Eternally Confused ) unsigned elf_hash ( void *key, int len ) { unsigned char *p = key; unsigned h = 0, g; int i; for ( i = 0; i < len; i++ ) { h = ( h << 4 ) + p[i]; g = …
97 c++  c  operators 


4
เวอร์ชันที่เขียนขึ้นของตัวดำเนินการทางตรรกะ
นี้เป็นสถานที่เดียวที่ฉันเคยเห็นand, orและnotระบุว่าเป็นผู้ประกอบการที่เกิดขึ้นจริงใน C ++ เมื่อฉันเขียนโปรแกรมทดสอบใน NetBeans ฉันได้ขีดเส้นใต้สีแดงราวกับว่ามีข้อผิดพลาดทางไวยากรณ์และคิดว่าเว็บไซต์ผิด แต่เป็น NetBeans ซึ่งผิดเพราะรวบรวมและทำงานตามที่คาดไว้ ฉันเห็นว่า!เป็นที่ชื่นชอบมากกว่าnotแต่ความสามารถในการอ่านand&& นั้นorดูดีกว่าพี่น้องที่ใช้ไวยากรณ์ของพวกเขา เหตุใดตัวดำเนินการทางตรรกะเวอร์ชันเหล่านี้จึงมีอยู่และเหตุใดจึงดูเหมือนไม่มีใครใช้ C ++ นี้ถูกต้องจริง ๆ หรือมีความเข้ากันได้บางอย่างกับ C ที่มาพร้อมกับภาษาหรือไม่?

2
## (แฮชคู่) ทำอะไรในคำสั่งพรีโปรเซสเซอร์
#define DEFINE_STAT(Stat) \ struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat; บรรทัดด้านบนมาจาก Unreal 4 และฉันรู้ว่าฉันสามารถถามมันได้ในฟอรัมที่ไม่จริง แต่ฉันคิดว่านี่เป็นคำถาม C ++ ทั่วไปที่รับประกันว่าถูกถามที่นี่ ฉันเข้าใจว่าบรรทัดแรกกำหนดมาโคร แต่ฉันไม่ชำนาญในเชนานิแกนของตัวประมวลผลล่วงหน้าใน C ++ ดังนั้นฉันจึงหลงทางตรงนั้น ตรรกะบอกฉันว่าแบ็กสแลชหมายความว่าการประกาศจะดำเนินต่อไปในบรรทัดถัดไป FThreadSafeStaticStat ดูเหมือนเทมเพลต แต่มี # เกิดขึ้นที่นั่นและไวยากรณ์ที่ฉันไม่เคยเห็นมาก่อนใน C ++ มีใครบอกฉันได้ไหมว่านี่หมายถึงอะไร ฉันเข้าใจว่าคุณอาจไม่มีสิทธิ์เข้าถึง Unreal 4 แต่เป็นเพียงไวยากรณ์ที่ฉันไม่เข้าใจ

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