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

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

5
รหัสเอกสาร: สาธารณะกับไม่ใช่สาธารณะ?
ฉันเป็นหนึ่งในนักพัฒนาที่มีความคิดว่าโค้ดที่เขียนควรอธิบายตนเองและอ่านเหมือนหนังสือ อย่างไรก็ตามเมื่อพัฒนารหัสห้องสมุดสำหรับคนอื่น ๆ ที่จะใช้ฉันพยายามที่จะนำเอกสารมากที่สุดในไฟล์ส่วนหัวเป็นไปได้; ซึ่งทำให้เกิดคำถาม: วิธีการจัดทำเอกสารที่ไม่ใช่แบบสาธารณะนั้นคุ้มค่ากับเวลาหรือไม่ พวกเขาจะไม่ใช้โดยตรงในความเป็นจริงพวกเขาไม่สามารถ ในเวลาเดียวกันถ้าฉันแจกจ่ายรหัสดิบ (แม้ว่าอย่างไม่เต็มใจ) วิธีการที่ไม่ใช่แบบสาธารณะเหล่านั้นจะสามารถมองเห็นได้และอาจต้องอธิบาย เพียงมองหามาตรฐานและแนวทางปฏิบัติที่คุณเห็นหรือใช้ในการเดินทางของคุณ

2
ประเภทข้อมูลความรับผิดชอบเดี่ยวและกำหนดเอง
ในช่วงหลายเดือนที่ผ่านมาฉันขอคนที่นี่ทางทิศตะวันออกเฉียงใต้และในเว็บไซต์อื่น ๆ เสนอคำวิจารณ์ที่สร้างสรรค์เกี่ยวกับรหัสของฉัน มีสิ่งหนึ่งที่โผล่ออกมาเกือบทุกครั้งและฉันก็ยังไม่เห็นด้วยกับคำแนะนำนั้น : P ฉันต้องการที่จะพูดคุยที่นี่และบางทีสิ่งต่าง ๆ จะชัดเจนสำหรับฉัน มันเกี่ยวกับหลักการความรับผิดชอบเดี่ยว (SRP) โดยทั่วไปฉันมีคลาสข้อมูลFontที่ไม่เพียง แต่มีฟังก์ชั่นสำหรับจัดการข้อมูล แต่ยังสำหรับการโหลด ฉันบอกว่าทั้งสองควรแยกจากกันฟังก์ชั่นการโหลดควรอยู่ในคลาสของโรงงาน ฉันคิดว่านี่เป็นความผิดพลาดของ SRP ... ชิ้นส่วนจากคลาสแบบอักษรของฉัน class Font { public: bool isLoaded() const; void loadFromFile(const std::string& file); void loadFromMemory(const void* buffer, std::size_t size); void free(); void some(); void another(); }; การออกแบบที่แนะนำ class Font { public: void some(); …

3
Object-C ++ ถูกเลิกใช้หรือไม่ [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา แอปเปิ้ลยกเลิกการสนับสนุนวัตถุประสงค์ -c ++ หรือไม่ หมายเหตุดังต่อไปนี้: ในคู่มือภาษา Objective-Cเคยมีส่วนในการผสมระหว่าง Object-c และ c ++ ส่วนนั้นหายไป ลิงก์ไปยังบทความเกี่ยวกับวัตถุประสงค์ c ++ บนเว็บไซต์ผู้พัฒนาแอปเปิ้ลดูเหมือนว่าจะไม่สามารถใช้งานได้และตอนนี้ถูกเปลี่ยนเส้นทางเช่นบทความนี้ซึ่งฉันพบในคำถามสแต็คโอเวอร์โฟลว์นี้ การค้นหา c ++ บนเว็บไซต์ apple dev จะทำให้ข้อมูลปัจจุบันมีน้อยมาก ฉันควรกังวลเกี่ยวกับการใช้ c ++ สำหรับการพัฒนา iOS หรือไม่
10 c++  objective-c  apple 

10
ต้องการอัลกอริทึมไปยังลูปที่เขียนด้วยมือไหม
ข้อใดต่อไปนี้ที่คุณพบว่าสามารถอ่านได้มากขึ้น วงเขียนด้วยมือ: for (std::vector<Foo>::const_iterator it = vec.begin(); it != vec.end(); ++it) { bar.process(*it); } หรืออัลกอริทึมภาวนา: #include <algorithm> #include <functional> std::for_each(vec.begin(), vec.end(), std::bind1st(std::mem_fun_ref(&Bar::process), bar)); ฉันสงสัยว่าstd::for_eachมันคุ้มค่าจริงหรือเปล่าจากตัวอย่างง่ายๆที่ต้องใช้รหัสจำนวนมาก คุณคิดอย่างไรกับเรื่องนี้?
10 c++  algorithms 

2
โครงการโอเพ่นซอร์ส C # ที่ใช้งานมากที่สุด?
ฉันกำลังมองหาโครงการโอเพนซอร์สที่กำลังดำเนินการใน C # ที่กำลังมองหานักพัฒนาและไม่สนใจว่าบุคคลที่เข้ามาจากพื้นหลัง C ++ คำแนะนำใด ๆ ที่ชื่นชม

4
C ++ วิธีที่ต้องการในการจัดการกับการใช้งานสำหรับแม่แบบขนาดใหญ่
โดยทั่วไปเมื่อประกาศคลาส C ++ เป็นแนวปฏิบัติที่ดีที่สุดที่จะใส่เฉพาะการประกาศในไฟล์ส่วนหัวและวางการประยุกต์ใช้ในไฟล์ต้นฉบับ อย่างไรก็ตามดูเหมือนว่ารูปแบบการออกแบบนี้จะไม่ทำงานกับคลาสเทมเพลต เมื่อดูทางออนไลน์มีความคิดเห็น 2 ข้อเกี่ยวกับวิธีที่ดีที่สุดในการจัดการคลาสเทมเพลต: 1. การประกาศทั้งหมดและการใช้งานในส่วนหัว สิ่งนี้ค่อนข้างตรงไปตรงมา แต่นำไปสู่สิ่งที่ฉันคิดว่าเป็นเรื่องยากที่จะรักษาและแก้ไขไฟล์โค้ดเมื่อเทมเพลตมีขนาดใหญ่ 2. เขียนการใช้งานในเทมเพลตรวมไฟล์ (.tpp) ที่รวมอยู่ท้าย ดูเหมือนว่าจะเป็นทางออกที่ดีกว่าสำหรับฉัน แต่ดูเหมือนจะไม่ได้ใช้อย่างกว้างขวาง มีเหตุผลที่วิธีนี้ด้อยกว่าหรือไม่? ฉันรู้ว่าหลายครั้งที่รูปแบบของรหัสถูกกำหนดโดยการตั้งค่าส่วนตัวหรือรูปแบบดั้งเดิม ฉันกำลังเริ่มโครงการใหม่ (การย้ายโครงการ C เก่าไปยัง C ++) และฉันค่อนข้างใหม่ในการออกแบบ OO และต้องการปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดตั้งแต่เริ่มต้น

3
วิธีการออกแบบโปรแกรม C ++ เพื่ออนุญาตให้นำเข้าฟังก์ชั่นรันไทม์?
วันนี้ฉันอยากถามคุณเกี่ยวกับความสามารถของ C ++ ในการตระหนักถึงสถาปัตยกรรมซอฟต์แวร์เฉพาะ แน่นอนฉันใช้การค้นหา แต่ไม่พบคำตอบที่เชื่อมโยงโดยตรง โดยพื้นฐานแล้วเป้าหมายของฉันคือการสร้างโปรแกรมที่อนุญาตให้ผู้ใช้สร้างแบบจำลองและจำลองระบบทางกายภาพที่ประกอบขึ้นโดยพลการเช่นรถขับ ฉันคิดว่ามีไลบรารี่ของโมเดลทางกายภาพ (ฟังก์ชั่นภายในคลาส) แต่ละฟังก์ชั่นอาจมีอินพุตบางส่วนและส่งคืนเอาต์พุตบางอย่างขึ้นอยู่กับคำอธิบายทางกายภาพเช่นโมเดลเครื่องยนต์เผาไหม้รุ่นลากอากาศพลศาสตร์แบบจำลองล้อเป็นต้น ตอนนี้ความคิดคือการจัดเตรียมเฟรมเวิร์กให้กับผู้ใช้ซึ่งช่วยให้เขาสามารถเขียนฟังก์ชั่นใด ๆ ตามความต้องการของเขาเช่นเพื่อแมปพฤติกรรมทางกายภาพใด ๆ เฟรมเวิร์กควรจัดเตรียมฟังก์ชันการทำงานเพื่อเชื่อมต่อเอาต์พุตและอินพุตของฟังก์ชันที่แตกต่างกัน ดังนั้นกรอบงานให้คลาสคอนเทนเนอร์ ฉันเรียกมันว่า COMPONENT ซึ่งสามารถเก็บวัตถุโมเดลหนึ่งหรือหลายอันได้ (ฟังก์ชั่น) คอนเทนเนอร์เหล่านี้ยังสามารถเก็บส่วนประกอบอื่น ๆ (รูปแบบคอมโพสิต) รวมถึงการเชื่อมต่อ (CONNECTOR) ระหว่างพารามิเตอร์ฟังก์ชัน นอกจากนี้คลาสคอมโพเนนต์ยังมีฟังก์ชันตัวเลขทั่วไปเช่นตัวแก้ปัญหาคณิตศาสตร์และอื่น ๆ องค์ประกอบของฟังก์ชั่นควรจะทำในช่วงรันไทม์ ในตัวอย่างแรกผู้ใช้ควรจะสามารถตั้งค่าการแต่งเพลงผ่านการนำเข้า XML ซึ่งกำหนดโครงสร้างองค์ประกอบ หลังจากนั้นหนึ่งอาจคิดเพิ่ม GUI เพื่อให้คุณเข้าใจมากขึ้นนี่เป็นตัวอย่างที่ง่ายมาก: <COMPONENT name="Main"> <COMPONENT name="A"> <FUNCTION name="A1" path="lib/functionA1" /> </COMPONENT> <COMPONENT name="B"> <FUNCTION name="B1" path="lib/functionB1" /> …

2
ไม่มีปัญหาเรื่องไก่และไข่ตั้งแต่ GCC เขียนใน C ++ เอง?
ตั้งแต่ 4.8 รีลีส C ++ คอมไพเลอร์ GCC (ส่วน G ++) จะถูกเขียนไม่ได้อยู่ใน C อีกต่อไป แต่ใน C ++ ฉันมีคำถามสมมุติในเรื่องนี้ ฉันสงสัยว่าจะรวบรวมรหัส C ++ ของ GCC บนแพลตฟอร์มใหม่ที่ไม่มีคอมไพเลอร์ C ++ ได้อย่างไร แน่นอนคุณสามารถใช้ไบนารีที่สร้างไว้ล่วงหน้าซึ่งรวบรวมไว้ในเครื่องอื่น ๆ หรือคุณสามารถใช้ GCC รุ่นเก่ากว่าที่เขียนใน C และคอมไพล์เวอร์ชันปัจจุบันด้วย อย่างไรก็ตามหากไม่มีไบนารีที่สร้างไว้ล่วงหน้าแล้วและเป็นเวอร์ชั่นใหม่ล่าสุดคุณติดอยู่ใช่ไหม? ถ้าไม่มีความหมายอื่น ๆ ในสถานการณ์นี้ที่เกิดจากการสลับจาก C เป็น C ++ ของโครงการ GCC หรือไม่
10 c++  compiler  gcc 

3
C ++: Metaprogramming ด้วย API คอมไพเลอร์มากกว่าด้วยคุณสมบัติ C ++
สิ่งนี้เริ่มต้นจากคำถาม SO แต่ฉันรู้ว่ามันค่อนข้างแปลกใหม่และตามคำอธิบายที่แท้จริงบนเว็บไซต์มันอาจจะเหมาะกว่าสำหรับ programmers.se เนื่องจากคำถามมีน้ำหนักเชิงแนวคิดจำนวนมาก ฉันได้เรียนรู้เสียงดังกังวาน LibToolingและเป็นเครื่องมือที่มีประสิทธิภาพมากที่สามารถเปิดเผย "nitty gritty" ทั้งหมดของรหัสด้วยวิธีที่เป็นมิตรกล่าวคือในทางที่เป็นความหมายและไม่ต้องเดาด้วยเช่นกัน ถ้าเสียงดังกราวสามารถรวบรวมรหัสของคุณแล้วเสียงดังกราวเป็นบางอย่างเกี่ยวกับความหมายของตัวละครทุกตัวเดียวภายในรหัสว่า ตอนนี้ให้ฉันถอยกลับสักครู่ มีปัญหาในทางปฏิบัติมากมายที่เกิดขึ้นเมื่อมีคนเข้าร่วมในเทมเพลต metaprogramming เทมเพลต C ++ (และโดยเฉพาะอย่างยิ่งเมื่อมีการใช้เทมเพลตเกินกว่าเทมเพลตเข้าไปในอาณาเขตของมาโครที่ชาญฉลาด ตามจริงแล้วสำหรับโปรแกรมเมอร์หลาย ๆ คนรวมถึงตัวเองการใช้งานเทมเพลตทั่วไปจำนวนมากก็ค่อนข้างน่ากลัวเช่นกัน ผมคิดว่าเป็นตัวอย่างที่ดีจะเป็นสตริงเวลารวบรวม นี่เป็นคำถามที่มีอายุเกินหนึ่งปีแล้ว แต่เป็นที่ชัดเจนว่า C ++ ณ ตอนนี้ไม่ได้ทำให้เป็นเรื่องง่ายสำหรับมนุษย์ปุถุชน ในขณะที่ดูตัวเลือกเหล่านี้ยังไม่เพียงพอที่จะทำให้เกิดอาการคลื่นไส้สำหรับฉัน แต่ก็ทำให้ฉันไม่มั่นใจเกี่ยวกับความสามารถในการสร้างรหัสเครื่องจักรที่มีประสิทธิภาพและมีประสิทธิภาพสูงสุดเพื่อให้เหมาะกับแอปพลิเคชันแฟนซีที่ฉันมีสำหรับซอฟต์แวร์ของฉัน ฉันหมายความว่าเรามาเจอกันคนอื่น ๆ สตริงนั้นค่อนข้างเรียบง่ายและเรียบง่าย พวกเราบางคนแค่ต้องการวิธีที่สะดวกในการปล่อยรหัสเครื่องที่มีสตริง "อบใน" อย่างมีนัยสำคัญมากกว่าที่เราจะได้รับเมื่อทำการเข้ารหัสในลักษณะที่ตรงไปตรงมา ในรหัส C ++ ของเรา ป้อน clang และ LibTooling ซึ่งแสดงแผนผังต้นไม้นามธรรม (AST) ของซอร์สโค้ดและอนุญาตให้แอปพลิเคชัน C ++ แบบกำหนดเองอย่างง่าย …

7
ตรวจสอบให้แน่ใจว่าส่วนหัวจะถูกรวมไว้อย่างชัดเจนในไฟล์ CPP
ฉันคิดว่าเป็นเรื่องดี#includeสำหรับส่วนหัวสำหรับประเภทใด ๆ ที่ใช้ในไฟล์ CPP โดยไม่คำนึงถึงสิ่งที่รวมอยู่ในไฟล์ HPP ดังนั้นฉันจึงอาจเป็นได้#include <string>ทั้ง HPP และ CPP แม้ว่าฉันจะสามารถรวบรวมได้หากฉันข้ามใน CPP ด้วยวิธีนี้ฉันไม่ต้องกังวลว่า HPP ของฉันจะใช้การประกาศล่วงหน้าหรือไม่ มีเครื่องมือใดที่สามารถบังคับใช้#includeรูปแบบการเข้ารหัสนี้ได้หรือไม่? ฉันควรบังคับใช้รูปแบบการเข้ารหัสนี้หรือไม่ เนื่องจากตัวประมวลผลล่วงหน้า / คอมไพเลอร์ไม่สนใจว่า#includeจะมาจาก HPP หรือ CPP ฉันจึงไม่ได้รับคำติชมถ้าฉันลืมทำตามสไตล์นี้

4
รูปแบบการออกแบบสำหรับพฤติกรรม polymorphic ในขณะที่อนุญาตให้แยกไลบรารี
สมมติว่าผมมีลำดับชั้นของชั้นเรียน:Item Rectangle, Circle, Triangleฉันต้องการที่จะสามารถวาดพวกเขาดังนั้นความเป็นไปได้ครั้งแรกของฉันคือการเพิ่มDraw()วิธีเสมือนในแต่ละ: class Item { public: virtual ~Item(); virtual void Draw() =0; }; อย่างไรก็ตามฉันต้องการแยกฟังก์ชั่นการวาดภาพเป็นห้องสมุดวาดแยกในขณะที่ห้องสมุด Core มีเพียงการแสดงขั้นพื้นฐาน มีความเป็นไปได้สองอย่างที่ฉันคิดได้: 1 - A DrawManagerที่รับรายการItems และต้องใช้dynamic_cast<>เพื่อระบุสิ่งที่ต้องทำ: class DrawManager { void draw(ItemList& items) { FOREACH(Item* item, items) { if (dynamic_cast<Rectangle*>(item)) { drawRectangle(); } else if (dynamic_cast<Circle*>(item)) { drawCircle(); } .... } } }; …

3
ฉันควร encapsulate การเข้าถึงฐานข้อมูลได้อย่างไร
ตัวอย่างของโครงสร้างชั้นดีที่ใช้ในการจัดการการเข้าถึงฐานข้อมูลคืออะไร ฉันเป็นแฟนตัวยงของคลาสแค็ปซูลและต้องการให้คอนเทนเนอร์ (เช่นรถยนต์) ไม่ทำงานฐานข้อมูล ฉันต้องการความสามารถในการปล่อยสิ่งต่าง ๆ เช่นแคชฐานข้อมูลในอนาคตได้อย่างง่ายดาย ฉันมักจะใช้รูปแบบของคลาสคอนเทนเนอร์พร้อมด้วย getters และ setters สำหรับการตรวจสอบความถูกต้องและการเข้าถึงฐานข้อมูลที่ดำเนินการโดยคลาส singleton เดียว ที่ถูกกล่าวว่านี้มักจะผสมระหว่างคนทั้งสองและกลายเป็นค่อนข้างสับสน ขออภัยถ้าคำถามของฉันยากที่จะเข้าใจ ฉันไม่แน่ใจเกี่ยวกับคำศัพท์เกี่ยวกับฐานข้อมูลอย่างแน่นอน โปรดสอบถามหากจำเป็น
10 c++  database 

3
คลาสพื้นฐานที่เป็นนามธรรมและการสร้างสำเนากฎของหัวแม่มือ
บ่อยครั้งที่เป็นความคิดที่ดีที่จะมีคลาสฐานนามธรรมเพื่อแยกอินเทอร์เฟซของวัตถุ ปัญหาคือการสร้างการคัดลอก IMHO นั้นค่อนข้างเสียหายโดยค่าเริ่มต้นใน C ++ โดยที่ตัวสร้างสำเนาจะถูกสร้างขึ้นตามค่าเริ่มต้น ดังนั้น gotchas คืออะไรเมื่อคุณมีคลาสฐานนามธรรมและพอยน์เตอร์ดิบในคลาสที่ได้รับ class IAbstract { ~IAbstract() = 0; } class Derived : public IAbstract { char *theProblem; ... } IAbstract *a1 = new Derived(); IAbstract a2 = *a1;//??? และตอนนี้คุณปิดการใช้งานการคัดลอกอย่างหมดจดสำหรับลำดับชั้นทั้งหมดหรือไม่ ประกาศคัดลอกการก่อสร้างเป็นส่วนตัวIAbstractหรือไม่ มีกฎสามข้อในคลาสฐานนามธรรมหรือไม่?

9
มรดกเทียบกับองค์ประกอบสำหรับชิ้นหมากรุก
การค้นหาอย่างรวดเร็วของ stackexchange นี้แสดงให้เห็นว่าในองค์ประกอบทั่วไปโดยทั่วไปถือว่ามีความยืดหยุ่นมากกว่าการสืบทอด แต่เช่นเคยขึ้นอยู่กับโครงการ ฯลฯ และมีหลายครั้งที่การสืบทอดเป็นตัวเลือกที่ดีกว่า ฉันต้องการสร้างเกมหมากรุกสามมิติที่แต่ละชิ้นมีตาข่ายอาจเป็นภาพเคลื่อนไหวที่แตกต่างกันไปเรื่อย ๆ ในตัวอย่างที่เป็นรูปธรรมนี้ดูเหมือนว่าคุณสามารถโต้แย้งกรณีสำหรับทั้งสองวิธีฉันผิดหรือเปล่า? การสืบทอดจะมีลักษณะเช่นนี้ (พร้อมตัวสร้างที่เหมาะสม ฯลฯ ) class BasePiece { virtual Squares GetValidMoveSquares() = 0; Mesh* mesh; // Other fields } class Pawn : public BasePiece { Squares GetValidMoveSquares() override; } ซึ่งแน่นอนว่าเป็นไปตามหลักการ "เป็น -a" ในขณะที่องค์ประกอบจะมีลักษณะเช่นนี้ class MovementComponent { virtual Squares GetValidMoveSquares() = 0; } …

2
การออกแบบที่เหมาะสมเพื่อหลีกเลี่ยงการใช้ dynamic_cast?
หลังจากทำการวิจัยบางอย่างฉันไม่สามารถหาตัวอย่างง่ายๆในการแก้ไขปัญหาที่ฉันพบบ่อยได้ สมมติว่าฉันต้องการสร้างแอปพลิเคชั่นเล็ก ๆ ที่ฉันสามารถสร้างSquares, Circles และรูปร่างอื่น ๆ แสดงมันบนหน้าจอปรับเปลี่ยนคุณสมบัติของพวกเขาหลังจากที่เลือกพวกเขาแล้วคำนวณขอบเขตทั้งหมดของพวกเขา ฉันจะทำคลาสโมเดลดังนี้: class AbstractShape { public : typedef enum{ SQUARE = 0, CIRCLE, } SHAPE_TYPE; AbstractShape(SHAPE_TYPE type):m_type(type){} virtual ~AbstractShape(); virtual float computePerimeter() const = 0; SHAPE_TYPE getType() const{return m_type;} protected : const SHAPE_TYPE m_type; }; class Square : public AbstractShape { public: Square():AbstractShape(SQUARE){} …

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