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

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

22
ตรวจสอบว่าสี่เหลี่ยมสองรูปทับกันหรือไม่
ฉันพยายามเขียนโปรแกรม C ++ ที่รับอินพุตต่อไปนี้จากผู้ใช้เพื่อสร้างรูปสี่เหลี่ยมผืนผ้า (ระหว่าง 2 และ 5): ความสูงความกว้าง x-pos, y-pos สี่เหลี่ยมเหล่านี้ทั้งหมดจะมีขนานกับแกน 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 …

14
เหตุใด C ++ จึงไม่มีการสะท้อน
นี่เป็นคำถามที่ค่อนข้างแปลกประหลาด วัตถุประสงค์ของฉันคือเข้าใจการตัดสินใจออกแบบภาษาและระบุความเป็นไปได้ของการสะท้อนใน C ++ ทำไมคณะกรรมการภาษา C ++ ไม่สามารถนำการสะท้อนกลับมาใช้ในภาษาได้? การสะท้อนกลับยากเกินไปในภาษาที่ไม่ได้ทำงานบนเครื่องเสมือน (เช่น java) หรือไม่? หากมีการใช้การสะท้อนกลับสำหรับ C ++ สิ่งที่จะเป็นความท้าทาย? ฉันเดาว่าการใช้การสะท้อนนั้นเป็นที่รู้จักกันดี: บรรณาธิการสามารถเขียนได้ง่ายขึ้นรหัสโปรแกรมจะเล็กลงสามารถสร้าง mocks สำหรับการทดสอบหน่วยและอื่น ๆ ได้ แต่มันจะดีถ้าคุณสามารถแสดงความคิดเห็นเกี่ยวกับการใช้การสะท้อนเช่นกัน
337 c++  reflection 

14
เมื่อใดที่คุณควรใช้ความสามารถของ constexpr ใน C ++ 11
ดูเหมือนว่าสำหรับฉันแล้วการมี "ฟังก์ชั่นที่ส่งกลับค่า 5" จะทำลายหรือทำให้ความหมายของ "การเรียกใช้ฟังก์ชัน" ลดลง ต้องมีเหตุผลหรือต้องการความสามารถนี้มิเช่นนั้นจะไม่อยู่ใน C ++ 11 ทำไมถึงอยู่ที่นั่น? // preprocessor. #define MEANING_OF_LIFE 42 // constants: const int MeaningOfLife = 42; // constexpr-function: constexpr int MeaningOfLife () { return 42; } สำหรับฉันดูเหมือนว่าถ้าฉันเขียนฟังก์ชันที่ส่งคืนค่าตามตัวอักษรและฉันได้รับการตรวจสอบโค้ดใครบางคนจะบอกฉันฉันก็ควรจะประกาศค่าคงที่แทนการเขียนส่งคืน 5
337 c++  c++11  constexpr 

9
การเชื่อมโยงภายนอกและการเชื่อมโยงภายในคืออะไร
ฉันต้องการเข้าใจการเชื่อมโยงภายนอกและการเชื่อมโยงภายในและความแตกต่าง ฉันยังต้องการทราบความหมายของ constการเชื่อมโยงตัวแปรภายในโดยค่าเริ่มต้นเว้นแต่จะประกาศเป็นexternอย่างอื่น
337 c++  c++-faq 

5
จะใช้ range-based สำหรับ () loop กับ std :: map ได้อย่างไร?
ตัวอย่างทั่วไปสำหรับลูป C ++ 11 ที่ใช้สำหรับ () เป็นบางสิ่งที่ง่ายเช่นนี้เสมอ: 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 : …

17
std :: string เป็นถ่าน *
ฉันต้องการแปลงstd :: stringเป็นchar *หรือchar []ชนิดข้อมูล std::string str = "string"; char* chr = str; ผลการค้นหาใน: “ข้อผิดพลาด: ไม่สามารถแปลง 'มาตรฐาน :: สตริง' เป็น 'ถ่าน' ...” มีวิธีการอะไรให้ทำเช่นนี้?
335 c++  string  char 

20
int a [] = {1,2,}; อนุญาตให้ใช้เครื่องหมายจุลภาคแปลก มีเหตุผลพิเศษไหม?
บางทีฉันอาจไม่ได้มาจากโลกใบนี้ แต่ดูเหมือนว่าฉันต่อไปนี้ควรเป็นข้อผิดพลาดทางไวยากรณ์: int a[] = {1,2,}; //extra comma in the end แต่มันไม่ใช่ ฉันรู้สึกประหลาดใจเมื่อรหัสนี้รวบรวม Visual Studio แต่ฉันได้เรียนรู้ที่จะไม่ไว้วางใจ MSVC คอมไพเลอร์เท่าที่ c ++ กฎระเบียบที่เกี่ยวข้องเพื่อให้ผมตรวจสอบมาตรฐานและเป็นที่ได้รับอนุญาตตามมาตรฐานเช่นกัน คุณสามารถดู 8.5.1 สำหรับกฎไวยากรณ์หากคุณไม่เชื่อฉัน ทำไมถึงได้รับอนุญาต นี่อาจเป็นคำถามที่ไร้ประโยชน์ แต่ฉันต้องการให้คุณเข้าใจว่าทำไมฉันถึงถาม หากเป็นกรณีย่อยของกฎไวยากรณ์ทั่วไปฉันจะเข้าใจ - พวกเขาตัดสินใจที่จะไม่ทำให้ไวยากรณ์ทั่วไปยากขึ้นเพียงเพื่อไม่อนุญาตให้ใช้เครื่องหมายจุลภาคซ้ำซ้อนในตอนท้ายของรายการ initializer แต่ไม่อนุญาตให้ใช้เครื่องหมายจุลภาคเพิ่มเติมอย่างชัดเจน ยกตัวอย่างเช่นมันจะไม่ได้รับอนุญาตให้มีเครื่องหมายจุลภาคซ้ำซ้อนในตอนท้ายของรายการอาร์กิวเมนต์ฟังก์ชั่นการโทร (เมื่อฟังก์ชั่นใช้เวลา...) ซึ่งเป็นเรื่องปกติ ดังนั้นอีกครั้งมีเหตุผลใดที่อนุญาตให้ใช้เครื่องหมายจุลภาคซ้ำซ้อนนี้อย่างชัดเจนหรือไม่

5
อินไลน์เนมสเปซคืออะไร
C ++ 11 ช่วยให้inline namespaces namespaceสมาชิกทั้งหมดที่มีโดยอัตโนมัติในการปิดล้อม ฉันไม่สามารถนึกถึงแอปพลิเคชั่นที่มีประโยชน์ของเรื่องนี้ - บางคนได้โปรดยกตัวอย่างสั้น ๆ รวบรัดของสถานการณ์ที่inline namespaceต้องการและที่เป็นวิธีแก้ปัญหาสำนวนที่สุด? (นอกจากนี้ยังไม่ชัดเจนสำหรับฉันว่าจะเกิดอะไรขึ้นเมื่อ a namespaceถูกประกาศinlineในที่เดียว แต่ไม่ใช่การประกาศทั้งหมดซึ่งอาจอยู่ในไฟล์ที่แตกต่างกันนี่ไม่ใช่สิ่งที่ขอให้เกิดปัญหาหรือไม่)

11
ฉันจะพิมพ์ค่าสองเท่าด้วยความแม่นยำเต็มที่ใช้ cout ได้อย่างไร
ดังนั้นฉันจึงได้คำตอบสำหรับคำถามสุดท้ายของฉัน(ฉันไม่รู้ว่าทำไมฉันไม่คิดอย่างนั้น) ฉันกำลังพิมพ์การdoubleใช้coutที่ปัดเศษเมื่อฉันไม่ได้คาดหวัง ฉันจะcoutพิมพ์doubleด้วยความแม่นยำได้อย่างไร

2
วิธีการใช้อัลกอริทึมการเรียงลำดับแบบคลาสสิกใน C ++ ที่ทันสมัย?
std::sortอัลกอริทึม (และญาติของตนstd::partial_sortและstd::nth_element) จาก ++ ห้องสมุด C มาตรฐานในการใช้งานมากที่สุดควบซับซ้อนและไฮบริดของขั้นตอนวิธีการเรียงลำดับประถมศึกษามากขึ้นเช่นการเลือกเรียงลำดับการจัดเรียงแทรกรวดเร็วเรียงลำดับผสานเรียงลำดับหรือการจัดเรียงกอง มีคำถามมากมายที่นี่และในเว็บไซต์น้องสาวเช่นhttps://codereview.stackexchange.com/ที่เกี่ยวข้องกับข้อบกพร่องความซับซ้อนและด้านอื่น ๆ ของการใช้งานของอัลกอริทึมการเรียงลำดับแบบคลาสสิกเหล่านี้ การนำไปใช้งานที่นำเสนอส่วนใหญ่ประกอบด้วยลูปดิบใช้การจัดการดัชนีและประเภทที่เป็นรูปธรรมและโดยทั่วไปจะไม่วิเคราะห์ในแง่ของความถูกต้องและมีประสิทธิภาพ คำถาม : อัลกอริทึมการเรียงลำดับแบบคลาสสิกที่กล่าวถึงข้างต้นสามารถนำไปใช้งานได้อย่างไรโดยใช้ C ++ สมัยใหม่ ไม่มีลูปแบบดิบแต่รวมการสร้างแบบอัลกอริทึมของ Standard Library เข้าด้วยกัน<algorithm> อินเทอร์เฟซตัววนซ้ำและการใช้เทมเพลตแทนการจัดการดัชนีและชนิดที่เป็นรูปธรรม สไตล์ C ++ 14รวมถึงไลบรารี่มาตรฐานเต็มรูปแบบรวมถึงตัวลดสัญญาณเสียงวากยสัมพันธ์เช่นautoนามแฝงเทมเพลตตัวเปรียบเทียบโปร่งใสและแลมบ์ดา polymorphic หมายเหตุ : สำหรับการอ้างอิงเพิ่มเติมเกี่ยวกับการใช้งานของอัลกอริทึมการเรียงลำดับดูWikipedia , รหัส Rosettaหรือhttp://www.sorting-algorithms.com/ ตามอนุสัญญาของฌอนพาเรนต์ (สไลด์ 39) ห่วงดิบเป็นวงที่forยาวกว่าองค์ประกอบของสองฟังก์ชันกับตัวดำเนินการ ดังนั้นf(g(x));หรือf(x); g(x);หรือf(x) + g(x);ไม่ได้ลูปดิบและไม่เป็นลูปในselection_sortและinsertion_sortด้านล่าง ฉันทำตามคำศัพท์ของ Scott Meyers เพื่อแสดง C ++ 1y ปัจจุบันเป็น C …

3
0 คือตัวอักษรทศนิยมหรือตัวอักษรฐานแปด?
Zero เป็นศูนย์เสมอดังนั้นมันไม่สำคัญ แต่ในการสนทนาเมื่อเร็ว ๆ นี้กับเพื่อนเขาบอกว่าตัวอักษรฐานแปดแทบไม่ได้ใช้ในปัจจุบัน †จากนั้นก็จะเริ่มขึ้นเมื่อฉันที่จริงเกือบทุกตัวอักษรของจำนวนเต็มในรหัสของฉันมี0ฐานแปดคือ คือ0ฐานแปดตัวอักษรตามที่ c ++ ไวยากรณ์? มาตรฐานพูดอะไร †การใช้งานจริงเท่านั้นที่ฉันรับรู้คือการอนุญาตให้ใช้ไฟล์ unix
329 c++  zero  octal 

10
วิธีการใช้รูปแบบวิธีการจากโรงงานใน C ++ อย่างถูกต้อง
มีสิ่งหนึ่งใน C ++ ที่ทำให้ฉันรู้สึกไม่สบายตัวเป็นเวลานานเพราะฉันไม่รู้วิธีการทำอย่างสุจริตแม้ว่ามันจะฟังดูง่าย: ฉันจะใช้วิธีการโรงงานใน C ++ ได้อย่างถูกต้องได้อย่างไร เป้าหมาย: เพื่อให้ลูกค้าสามารถสร้างอินสแตนซ์ของวัตถุโดยใช้วิธีการจากโรงงานแทนตัวสร้างของวัตถุโดยไม่มีผลกระทบที่ยอมรับไม่ได้และประสิทธิภาพในการทำงาน โดย "รูปแบบวิธีการของโรงงาน" ฉันหมายถึงทั้งวิธีคงที่จากโรงงานภายในวัตถุหรือวิธีที่กำหนดไว้ในคลาสอื่นหรือฟังก์ชั่นระดับโลก เพียงแค่โดยทั่วไป "แนวคิดของการเปลี่ยนเส้นทางวิธีปกติของการสร้างอินสแตนซ์ของคลาส X ไปที่อื่นนอกเหนือจากตัวสร้าง" ให้ฉันอ่านคำตอบที่เป็นไปได้ที่ฉันคิด 0) อย่าสร้างโรงงานสร้างสิ่งก่อสร้าง สิ่งนี้ฟังดูดี (และมักจะเป็นทางออกที่ดีที่สุด) แต่ไม่ใช่วิธีการรักษาทั่วไป ประการแรกมีกรณีที่การก่อสร้างวัตถุเป็นงานที่ซับซ้อนพอที่จะพิสูจน์การแยกไปยังชั้นอื่น แต่ถึงกระนั้นก็ยังมีการวางความจริงนั้นไว้แม้กระทั่งสำหรับวัตถุอย่างง่ายที่ใช้เพียงแค่ตัวสร้างมักจะไม่ทำ ตัวอย่างที่ง่ายที่สุดที่ฉันรู้คือคลาสเวกเตอร์ 2 มิติ เรียบง่าย แต่ซับซ้อน ฉันต้องการสร้างมันทั้งจากพิกัดคาร์ทีเซียนและขั้ว เห็นได้ชัดว่าฉันไม่สามารถทำ: struct Vec2 { Vec2(float x, float y); Vec2(float angle, float magnitude); // not a valid overload! // ... …

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); } } และยังเร็วกว่าตัวสร้างตัวเลขสุ่มอื่น ๆ


12
เหตุใดอะเรย์ความยาวผันแปรจึงไม่ได้เป็นส่วนหนึ่งของมาตรฐาน C ++
ฉันไม่ได้ใช้ C มากในช่วงไม่กี่ปีที่ผ่านมา เมื่อฉันอ่านคำถามนี้วันนี้ฉันเจอไวยากรณ์ C ที่ฉันไม่คุ้นเคย เห็นได้ชัดว่าในC99ไวยากรณ์ต่อไปนี้ถูกต้อง: void foo(int n) { int values[n]; //Declare a variable length array } ดูเหมือนว่าเป็นคุณสมบัติที่มีประโยชน์มาก เคยมีการอภิปรายเกี่ยวกับการเพิ่มลงในมาตรฐาน C ++ หรือไม่และถ้าเป็นเช่นนั้นทำไมถึงถูกตัดทิ้ง เหตุผลที่เป็นไปได้บางประการ: มีขนดกสำหรับผู้ขายคอมไพเลอร์ที่จะใช้งาน เข้ากันไม่ได้กับส่วนอื่น ๆ ของมาตรฐาน สามารถเลียนแบบการทำงานด้วยการสร้าง C ++ อื่น ๆ สถานะมาตรฐาน C ++ ที่ขนาดอาร์เรย์ต้องเป็นนิพจน์คงที่ (8.3.4.1) ใช่แน่นอนฉันรู้ว่าในตัวอย่างของเล่นสามารถใช้งานstd::vector<int> values(m);ได้ แต่สิ่งนี้จัดสรรหน่วยความจำจากฮีปไม่ใช่สแต็ก และถ้าฉันต้องการอาร์เรย์หลายมิติเช่น: void foo(int x, int y, int z) …

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