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

คำถามเกี่ยวกับ C ++ ซึ่งเป็นภาษาการเขียนแบบสแตติกแบบหลายกระบวนทัศน์รวบรวมภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไป

3
วิธีการอย่างมืออาชีพในการสร้างปัญหาใหญ่โดยไม่ต้องกรอกอาร์เรย์ขนาดใหญ่: C ++ หน่วยความจำฟรีจากส่วนหนึ่งของอาร์เรย์
ฉันกำลังพัฒนาแบบจำลองทางฟิสิกส์และเนื่องจากฉันค่อนข้างใหม่กับการเขียนโปรแกรมฉันยังคงพบปัญหาเมื่อผลิตโปรแกรมขนาดใหญ่ ฉันรู้เกี่ยวกับการจัดสรรและลบหน่วยความจำแบบไดนามิก (ใหม่ / ลบ ฯลฯ ) แต่ฉันต้องการวิธีที่ดีกว่าในการจัดโครงสร้างโปรแกรม สมมติว่าฉันกำลังจำลองการทดสอบที่ใช้งานมาสองสามวันด้วยอัตราการสุ่มตัวอย่างที่ใหญ่มาก ฉันต้องการจำลองตัวอย่างเป็นพันล้านตัวอย่าง ในฐานะเวอร์ชั่นที่เรียบง่ายที่สุดเราจะกล่าวว่าโปรแกรมใช้แรงดันไฟฟ้า V [i] และรวมเข้าด้วยกันเป็นห้า: ie NewV [0] = V [0] + V [1] + V [2] + V [3] + V [4] NewV [1] = V [1] + V [2] + V [3] + V [4] + V [5] ดังนั้น …
20 c++  data  memory  array  dynamic 

2
ทำไม Java จึงไม่ใส่ชื่อไฟล์ลงไป?
ใน C และ C ++, วิธีการหลักเก็บชื่อไฟล์ในตำแหน่งแรกของอาร์เรย์ที่ argv [0] อย่างไรก็ตามใน Java ชื่อไฟล์จะไม่รวมอยู่ในอาร์เรย์สตริง args มีเหตุผลในทางปฏิบัติสำหรับสิ่งนี้หรือไม่? ฉันเข้าใจว่าสิ่งนี้ทำให้การวนซ้ำผ่านอาร์กิวเมนต์บรรทัดคำสั่ง 0-based แทน 1-based แต่มีประโยชน์ไหม? ชื่อไฟล์นั้นถือว่าไร้ประโยชน์หรือไม่?
20 java  c++  c 

7
วิธีการป้องกันที่ดีที่สุดจาก 0 ผ่านไปยัง std :: พารามิเตอร์สตริง?
ฉันเพิ่งรู้ว่ามีอะไรรบกวน ทุกครั้งที่ฉันได้เขียนวิธีการที่ยอมรับstd::stringว่าเป็นพารามิเตอร์ฉันได้เปิดตัวเองเพื่อพฤติกรรมที่ไม่ได้กำหนด ตัวอย่างเช่นสิ่งนี้ ... void myMethod(const std::string& s) { /* Do something with s. */ } ... สามารถเรียกได้ว่าเป็นแบบนี้ ... char* s = 0; myMethod(s); ... และไม่มีอะไรที่ฉันสามารถทำได้เพื่อป้องกันมัน (ที่ฉันรู้) ดังนั้นคำถามของฉันคือ: มีคนป้องกันตัวเองจากสิ่งนี้ได้อย่างไร วิธีการเดียวที่อยู่ในใจคือการเขียนวิธีการสองแบบที่ยอมรับstd::stringเป็นพารามิเตอร์ดังนี้: void myMethod(const std::string& s) { /* Do something. */ } void myMethod(char* s) { if (s == 0) { throw …
20 c++ 

3
ฉันต้องคิดถึงรหัสเครื่องที่คอมไพล์เมื่อฉันเขียนรหัสหรือไม่?
ตัวอย่างเช่นฉันได้รับรหัสต่อไปนี้: auto z = [](int x) -> int { if (x > 0) { switch (x) { case 2: return 5; case 3: return 6; default: return 1; } } return 0; }; และต่อมาฉันเรียกสิ่งนี้หลายครั้ง ในรหัส asm ฉันเห็นสายภายนอกด้วยแลมบ์ดา .... บางสิ่งบางอย่าง ... มันกลายเป็นเรื่องง่ายที่จะอ่านและฉันคิดว่ามันอาจทำให้ประสิทธิภาพ ดังนั้นฉันอาจชนะในการเขียนโปรแกรม meta แต่ฉันเสียในการดีบัก asm และประสิทธิภาพหรือไม่ ฉันควรหลีกเลี่ยงฟีเจอร์ภาษาที่ทันสมัยมาโครและด้านการเขียนโปรแกรมเมตาอื่น ๆ เพื่อให้แน่ใจในประสิทธิภาพและการแก้ไขข้อบกพร่องอย่างง่ายหรือไม่?

1
แรงจูงใจและข้อผิดพลาด (?) ของคำหลักอัตโนมัติใน C ++ 11
ฉันเพิ่งสงสัยว่าทำไมคำหลักที่autoถูกเลือกใน C ++ 11 เพื่อทำเครื่องหมายตัวแปรที่ต้องสรุปประเภทของคอมไพเลอร์เช่น auto x = 1; ตั้งแต่ var ดูเหมือนจะพบได้ทั่วไปในภาษาการเขียนโปรแกรมอื่น ๆ (เช่น C #, Scala, JavaScript) และ เท่าที่ฉันเข้าใจความหมายใหม่ของการautoแบ่งความเข้ากันได้แบบย้อนหลัง (ไม่ค่อยได้ใช้ แต่มีความหมายแตกต่างกันในการแก้ไข C ++ ก่อนหน้าดูตัวอย่างที่นี่ ) ฉันต้องการถามว่ามีเหตุผลพิเศษในการเลือกauto(เพื่อประโยชน์ของvarคำหลักอื่นหรือไม่) มีการอภิปรายเฉพาะเกี่ยวกับปัญหานี้ก่อนปล่อยมาตรฐาน C ++ 11 หรือไม่ นอกจากนี้ยังมีความเข้ากันไม่ได้ที่เราควรระวังเมื่อทำการคอมไพล์รหัส C ++ ใหม่ด้วยคอมไพเลอร์ C ++ 11 หรือไม่?

5
เหตุใดห้องสมุดสมัยใหม่จึงไม่ใช้ OOP
ฉันเป็นโปรแกรมเมอร์ C ++ ระดับต้น แต่ฉันเข้าใจแนวคิดของภาษาค่อนข้างดี เมื่อฉันเริ่มเรียนรู้ไลบรารี C ++ ภายนอกเช่น SDL, OpenGL (อาจเป็นอย่างอื่น) ด้วยความประหลาดใจที่ยิ่งใหญ่ของฉันฉันพบว่าพวกเขาไม่ได้ใช้แนวคิด C ++ เลย ตัวอย่างเช่นทั้ง SDL และ OpenGL ไม่ใช้คลาสหรือข้อยกเว้นเลือกฟังก์ชั่นและรหัสข้อผิดพลาด ใน OpenGL ฉันเคยเห็นฟังก์ชั่นเช่น glVertex2f ซึ่งใช้ตัวแปรลอย 2 ตัวเป็นอินพุตและน่าจะดีกว่าเทมเพลต นอกจากนี้บางครั้งห้องสมุดเหล่านี้ใช้มาร์กอสในขณะที่ดูเหมือนว่าเป็นข้อตกลงทั่วไปที่ใช้มาโครไม่ดี โดยรวมแล้วพวกเขาดูเหมือนจะเขียนในสไตล์ C มากกว่าในสไตล์ C ++ แต่พวกเขาเป็นภาษาที่แตกต่างกันโดยสิ้นเชิงใช่มั้ย คำถามคือเหตุใดห้องสมุดสมัยใหม่จึงไม่ใช้ข้อดีของภาษาที่เขียน

7
ไฟล์ส่วนหัวดีจริงหรือ [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ฉันพบว่าไฟล์ส่วนหัวมีประโยชน์เมื่อเรียกดูไฟล์ต้นฉบับ C ++ เพราะพวกเขาให้ "บทสรุป" ของฟังก์ชั่นและสมาชิกข้อมูลทั้งหมดในชั้นเรียน ทำไมภาษาอื่น ๆ อีกมากมาย (เช่น Ruby, Python, Java และอื่น ๆ ) ไม่มีคุณสมบัติเช่นนี้ นี่เป็นพื้นที่ที่การใช้คำฟุ่มเฟือยของ C ++ มีประโยชน์ไหม?
20 c++ 

13
ทำไมระบบปฏิบัติการถึงมีข้อมูลระดับต่ำใน C และ C ++ ทำไมไม่ใช่แค่ C ++?
ในหน้า Wikipedia สำหรับ Windowsจะระบุว่า Windows เขียนไว้ใน Assembly สำหรับ bootloader และ task switcher และ C และ C ++ สำหรับเคอร์เนลรูทีน IIRC คุณสามารถเรียกใช้ฟังก์ชัน C ++ ได้จากextern "C"'d block ฉันสามารถใช้ C สำหรับฟังก์ชั่นเคอร์เนลเพื่อให้แอป C บริสุทธิ์สามารถใช้งานได้ (เช่นprintfและอย่างนั้น) แต่ถ้าพวกเขาสามารถห่อในextern "C "บล็อกแล้วทำไมต้องใช้รหัสใน C?

3
การทดสอบหน่วย C ++: ต้องทดสอบอะไร
TL; DR การเขียนแบบทดสอบที่ดีและมีประโยชน์นั้นยากและมีค่าใช้จ่ายสูงในภาษาซีพลัสพลัส นักพัฒนาที่มีประสบการณ์คุณสามารถแบ่งปันเหตุผลของคุณเกี่ยวกับอะไรและเวลาที่จะทดสอบ? เรื่องยาว ฉันเคยทำการพัฒนาที่ขับเคลื่อนด้วยการทดสอบทั้งทีมจริง ๆ แล้ว แต่มันก็ไม่ได้ผลสำหรับเรา เรามีการทดสอบมากมาย แต่ดูเหมือนว่าพวกเขาจะไม่ครอบคลุมกรณีที่เรามีข้อบกพร่องและการถดถอยจริงซึ่งมักจะเกิดขึ้นเมื่อมีการโต้ตอบหน่วยไม่ใช่จากพฤติกรรมที่แยกได้ นี่เป็นเรื่องยากมากที่จะทดสอบในระดับหน่วยที่เราหยุดทำ TDD (ยกเว้นส่วนประกอบที่ทำให้การพัฒนาเร็วขึ้น) และใช้เวลาเพิ่มการครอบคลุมการทดสอบการรวมแทน ในขณะที่การทดสอบหน่วยขนาดเล็กไม่เคยตรวจจับข้อบกพร่องจริง ๆ และเป็นเพียงค่าบำรุงรักษา แต่การทดสอบการรวมนั้นคุ้มค่ากับความพยายาม ตอนนี้ฉันได้รับโปรเจ็กต์ใหม่และฉันสงสัยว่าจะลองทำอย่างไร มันเป็นแอพพลิเคชั่น C ++ / OpenGL ดั้งเดิมดังนั้นการทดสอบการรวมเข้าด้วยกันจึงไม่ใช่ทางเลือก แต่การทดสอบหน่วยใน C ++ นั้นค่อนข้างยากกว่าใน Java (คุณต้องทำสิ่งต่าง ๆ อย่างชัดเจนvirtual) และโปรแกรมไม่ได้เน้นวัตถุมากดังนั้นฉันจึงไม่สามารถเยาะเย้ย / ทำอะไรบางอย่างได้ ฉันไม่ต้องการแยกออกจากกันและ OO-ize ทุกสิ่งเพียงเพื่อเขียนการทดสอบเพื่อประโยชน์ในการเขียนการทดสอบ ดังนั้นฉันถามคุณ: ฉันควรเขียนทดสอบอะไร เช่น: ฟังก์ชั่น / คลาสที่ฉันคาดว่าจะเปลี่ยนบ่อย? ฟังก์ชั่น / คลาสที่ยากต่อการทดสอบด้วยตนเอง? ฟังก์ชั่น …

6
กฎข้อที่ 5 - จะใช้หรือเปล่า?
กฎ 3 ( กฎ 5ในมาตรฐาน c ++ ใหม่): หากคุณต้องการประกาศตัว Destructor ให้คัดลอก Constructor หรือตัวดำเนินการกำหนดค่าด้วยตนเองอย่างชัดเจนคุณอาจต้องประกาศทั้งสามอย่างชัดเจน แต่ในทางกลับกัน " รหัสสะอาด " ของ Martin แนะนำให้ลบตัวสร้างและตัวทำลายที่ว่างเปล่าทั้งหมด (หน้า 293, G12: ความยุ่งเหยิง ): สิ่งที่ใช้เป็นตัวสร้างเริ่มต้นโดยไม่มีการใช้งาน? สิ่งที่มันทำคือถ่วงโค้ดด้วยส่วนที่ไม่มีความหมาย ดังนั้นวิธีจัดการกับทั้งสองความคิดเห็นที่ตรงกันข้าม? ควรใช้ตัวสร้าง / ตัวทำลายที่ว่างเปล่าจริงหรือไม่? ตัวอย่างถัดไปแสดงให้เห็นถึงสิ่งที่ฉันหมายถึง: #include <iostream> #include <memory> struct A { A( const int value ) : v( new int( value ) …

6
ฉันควรใช้คุณสมบัติ 'อัตโนมัติ' C ++ 11 ใหม่โดยเฉพาะในลูปหรือไม่
ข้อดี / ข้อเสียของการใช้autoคำหลักโดยเฉพาะในลูปคืออะไร for(std::vector<T>::iterator it = x.begin(); it != x.end(); it++ ) { it->something(); } for(std::map<T>::iterator it = x.begin(); it != x.end(); it++ ) { it->second->something(); } for(auto it = x.begin(); it != x.end(); it++ ) { it->?? } ดูเหมือนว่าถ้าคุณไม่รู้ว่าคุณมีตัววนซ้ำสำหรับแผนที่หรือเวกเตอร์คุณจะไม่รู้ว่าจะใช้หรือไม่ firstหรือsecondเข้าถึงคุณสมบัติของวัตถุโดยตรงหรือไม่? สิ่งนี้ทำให้ฉันนึกถึงการโต้วาที C # ว่าจะใช้คำหลักvarหรือไม่ ความประทับใจที่ฉันได้รับจนถึงขณะนี้คือในโลกคน C ++ พร้อมที่จะใช้autoคำหลักที่มีการต่อสู้น้อยกว่าvarในโลก C …
20 c++  c++11 

8
วิธีการกระจายความรู้สำหรับการเขียนโปรแกรมทั่วไปในหมู่สมาชิกในทีม?
ฉันอยู่ในสภาพแวดล้อมที่ผู้คนเชื่อว่า: Java generics เป็นคุณสมบัติที่ใช้สำหรับการเขียนไลบรารีโดยเฉพาะและไม่ใช่การเข้ารหัสที่แท้จริง C ++ เป็นภาษาการเขียนโปรแกรม OO; templateเป็นคุณสมบัติเสริมและหลีกเลี่ยงได้ แม้ว่าคนเหล่านี้จะพึ่งพาไลบรารีที่เขียนโดยใช้โปรแกรมทั่วไป (เช่น STL, คอนเทนเนอร์ Java) ถ้าผมเขียนโค้ดที่ใช้templateหรือgenericsรหัสวิจารณ์มีแนวโน้มที่จะปฏิเสธมันและจะแสดงความคิดเห็นที่จะเขียนมันใน"เหมาะสม / เข้าใจ / สง่างาม"วิธี ความคิดดังกล่าวสามารถใช้งานได้จากโปรแกรมเมอร์ปกติถึงผู้จัดการส่วนใหญ่อาวุโส ไม่มีทางออกเพราะ 90% ของเวลาคนเหล่านี้มีการวิ่งเต้น เป็นวิธีที่ดีที่สุด ( ไม่ถูกตัดคอ ) ของการอธิบายพวกเขาวิธีการปฏิบัติของการเขียนโค้ดซึ่งประกอบด้วย OO และการเขียนโปรแกรมทั่วไปทั้งสองในเวลาเดียวกันคืออะไร?
20 java  c++  templates  generics 

5
การทดสอบหน่วยนำไปสู่การวางนัยทั่วไปก่อนกำหนด (โดยเฉพาะในบริบทของ C ++) หรือไม่
บันทึกเบื้องต้น ฉันจะไม่เข้าไปในความแตกต่างของชนิดที่แตกต่างกันของการทดสอบมีมีอยู่แล้วไม่กี่คำถามในเว็บไซต์เหล่านี้เกี่ยวกับการที่ ฉันจะใช้สิ่งที่มีและที่กล่าวว่า: การทดสอบหน่วยในแง่ของ "การทดสอบหน่วยแยกได้ที่เล็กที่สุดของแอปพลิเคชัน"ซึ่งคำถามนี้มาจริง ปัญหาการแยกตัว คืออะไรหน่วย isolatable ที่เล็กที่สุดของโปรแกรม อย่างที่ฉันเห็นมันขึ้นอยู่กับว่าคุณกำลังใช้ภาษาอะไร Micheal Feathers พูดถึงแนวคิดของรอยต่อ : [WEwLC, p31] ตะเข็บเป็นสถานที่ที่คุณสามารถเปลี่ยนพฤติกรรมในโปรแกรมของคุณโดยไม่ต้องแก้ไขในสถานที่นั้น และโดยไม่ต้องลงรายละเอียดฉันเข้าใจตะเข็บ - ในบริบทของการทดสอบหน่วย - เป็นสถานที่ในโปรแกรมที่ "การทดสอบ" ของคุณสามารถเชื่อมต่อกับ "หน่วย" ของคุณ ตัวอย่าง การทดสอบหน่วย - โดยเฉพาะอย่างยิ่งใน C ++ ต้องการรหัสจากการทดสอบเพื่อเพิ่มตะเข็บเพิ่มเติมที่จะถูกเรียกอย่างเคร่งครัดสำหรับปัญหาที่ระบุ ตัวอย่าง: การเพิ่มอินเทอร์เฟซเสมือนซึ่งการใช้งานที่ไม่ใช่เสมือนจะเพียงพอ การแยก - การสรุป (?) - คลาส (เล็ก) เพิ่มเติม "เพียงแค่" เพื่ออำนวยความสะดวกในการเพิ่มการทดสอบ การแยกโครงการที่ดำเนินการได้ครั้งเดียวออกเป็น libs ที่ "อิสระ" ดูเหมือน …

8
การจัดการกับเพื่อนร่วมงานเมื่อมีการพัฒนาต้องการคำแนะนำ [ปิด]
เป็นการยากที่จะบอกสิ่งที่ถูกถามที่นี่ คำถามนี้คลุมเครือคลุมเครือไม่สมบูรณ์กว้างเกินไปหรือโวหารและไม่สามารถตอบได้อย่างสมเหตุสมผลในรูปแบบปัจจุบัน สำหรับความช่วยเหลือในการทำความเข้าใจคำถามนี้เพื่อที่จะสามารถเปิด, ไปที่ศูนย์ช่วยเหลือ ปิดให้บริการใน8 ปีที่ผ่านมา คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Software Engineering Stack Exchange อพยพ 8 ปีที่ผ่านมา ผมพัฒนาสถาปัตยกรรมโครงการปัจจุบันของเราและเริ่มพัฒนามันในตัวเอง(บางสิ่งบางอย่างถึงชอบ )revision 40 เรากำลังพัฒนาเฟรมเวิร์กการกำหนดเส้นทางรถไฟใต้ดินที่เรียบง่ายและการออกแบบของฉันก็ทำได้ดีมาก - โมเดลหลักหลายมุมมองที่สอดคล้องกันตรรกะหลักและโครงสร้างข้อมูลถูกสร้างแบบจำลอง "ที่ควรจะเป็น" และแยกออกจากการเรนเดอร์ นอกเหนือจากโมเดลหลักและมีจุดตัดเล็ก ๆ น้อย ๆ จำนวนหนึ่ง ฉันจะเรียกว่าการออกแบบที่ปรับขนาดได้ปรับแต่งได้ง่ายต่อการใช้งานการโต้ตอบส่วนใหญ่ขึ้นอยู่กับ "ปฏิสัมพันธ์กล่องดำ" และดีมาก ตอนนี้สิ่งที่ทำ: ฉันเริ่มต้นการใช้งานอินเทอร์เฟซที่เกี่ยวข้องบางอย่างย้ายบางไลบรารีที่สะดวกและเขียนส่วนการปรับใช้สำหรับบางส่วนของแอปพลิเคชัน ฉันมีเอกสารที่อธิบายถึงรูปแบบการเข้ารหัสและตัวอย่างของการใช้รูปแบบการเข้ารหัสนั้น (รหัสที่เป็นลายลักษณ์อักษรของฉันเอง) ฉันบังคับให้ใช้C++เทคนิคการพัฒนาที่ทันสมัยมากขึ้นหรือน้อยลงรวมถึงno-deleteโค้ด (ซึ่งพันผ่านตัวชี้อัจฉริยะ) และอื่น ๆ ฉันบันทึกวัตถุประสงค์ของการใช้งานอินเทอร์เฟซที่เป็นรูปธรรมและวิธีการใช้งาน การทดสอบหน่วย(ส่วนใหญ่เป็นการทดสอบการรวมเนื่องจากไม่มีรหัส "จริง" จำนวนมาก)และชุด mocks สำหรับ abstractions หลักทั้งหมด ฉันขาดเป็นเวลา …

9
เทคนิคการเขียนโปรแกรมทั่วไปเพื่อเพิ่มความเร็วในการเขียนโปรแกรม
ฉันกำลังเตรียมสำหรับการประกวดการเขียนโปรแกรมที่เราต้องใช้รหัสใน C ++ และทั้งหมดเกี่ยวกับการสร้างรหัสการทำงานในเวลาอันสั้น ตัวอย่างจะใช้มาโครเพื่อรับค่าต่ำสุดของสอง ints หรือใช้ memsets เพื่อเริ่มต้นอาร์เรย์ (แต่ฉันบอกว่าคุณไม่ควรใช้ทั้งสองที่นี่ ) สิ่งนี้นำไปสู่คำถามเทคนิคการเข้ารหัสแบบใดที่มีอยู่ให้ใช้ในงานจริง
20 c++ 

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