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

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

5
ฉันสามารถแสดงรายการ - เริ่มต้นเวกเตอร์ประเภทย้ายอย่างเดียวได้หรือไม่
ถ้าฉันส่งรหัสต่อไปนี้ผ่านสแนปชอต GCC 4.7 ของฉันมันจะพยายามคัดลอกunique_ptrs ลงในเวกเตอร์ #include <vector> #include <memory> int main() { using move_only = std::unique_ptr<int>; std::vector<move_only> v { move_only(), move_only(), move_only() }; } เห็นได้ชัดว่าไม่สามารถทำงานได้เนื่องจากstd::unique_ptrไม่สามารถคัดลอกได้: ข้อผิดพลาด: การใช้ฟังก์ชันที่ถูกลบ 'std :: unique_ptr <_Tp, _Dp> :: unique_ptr (const std :: unique_ptr <_Tp, _Dp> &) [ด้วย _Tp = int; _Dp = std :: default_delete; …

6
เหตุใดจึงต้องใช้ std :: make_unique ใน C ++ 17
เท่าที่ฉันเข้าใจ C ++ 14 แนะนำstd::make_uniqueเนื่องจากไม่ได้ระบุลำดับการประเมินพารามิเตอร์สิ่งนี้ไม่ปลอดภัย: f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A (คำอธิบาย: หากการประเมินจัดสรรหน่วยความจำให้กับตัวชี้ดิบเป็นอันดับแรกการเรียกใช้g()และข้อยกเว้นจะเกิดขึ้นก่อนการstd::unique_ptrสร้างหน่วยความจำจะรั่วไหล) การโทรstd::make_uniqueเป็นวิธีการ จำกัด ลำดับการโทรซึ่งทำให้สิ่งต่างๆปลอดภัย: f(std::make_unique<MyClass>(param), g()); // Syntax B ตั้งแต่นั้นมา, C ++ 17 ได้ชี้แจงเพื่อการประเมินผลที่ทำให้ไวยากรณ์ปลอดภัยเกินไปดังนั้นนี่คือคำถามของฉัน: คือยังคงมีเหตุผลที่จะใช้std::make_uniqueมากกว่าstd::unique_ptr's constructor ใน C ++ 17? คุณสามารถยกตัวอย่างได้หรือไม่? ณ ตอนนี้เหตุผลเดียวที่ฉันนึกได้คืออนุญาตให้พิมพ์ได้MyClassเพียงครั้งเดียว (สมมติว่าคุณไม่จำเป็นต้องพึ่งพาความหลากหลายด้วยstd::unique_ptr<Base>(new Derived(param))) อย่างไรก็ตามนั่นดูเหมือนเป็นเหตุผลที่ค่อนข้างอ่อนแอโดยเฉพาะอย่างยิ่งเมื่อstd::make_uniqueไม่อนุญาตให้ระบุ deleter ในขณะที่ตัวstd::unique_ptrสร้างทำ และเพื่อความชัดเจนฉันไม่สนับสนุนให้ลบออกstd::make_uniqueจาก Standard Library (อย่างน้อยก็เหมาะสมสำหรับความเข้ากันได้แบบย้อนหลัง) แต่ค่อนข้างสงสัยว่ายังมีสถานการณ์ที่ต้องการอย่างยิ่งstd::unique_ptr
98 c++  c++17  unique-ptr 

2
ป้องกันไม่ให้ฟังก์ชันรับ const std :: string & จากการยอมรับ 0
มีค่าหนึ่งพันคำ: #include<string> #include<iostream> class SayWhat { public: SayWhat& operator[](const std::string& s) { std::cout<<"here\n"; // To make sure we fail on function entry std::cout<<s<<"\n"; return *this; } }; int main() { SayWhat ohNo; // ohNo[1]; // Does not compile. Logic prevails. ohNo[0]; // you didn't! this compiles. return 0; } คอมไพเลอร์ไม่ได้บ่นเมื่อผ่านหมายเลข …

14
ทำไมต้องหลีกเลี่ยงการหล่อ? [ปิด]
ปิด . คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เน้นไปที่ปัญหาเดียวโดยแก้ไขโพสต์นี้เท่านั้น ปิดให้บริการใน4 ปีที่แล้ว ปรับปรุงคำถามนี้ โดยทั่วไปฉันจะหลีกเลี่ยงการแคสต์ประเภทให้มากที่สุดเนื่องจากฉันรู้สึกว่ามีการฝึกฝนการเขียนโค้ดที่ไม่ดีและอาจได้รับโทษด้านประสิทธิภาพ แต่ถ้ามีคนขอให้ฉันอธิบายว่าทำไมถึงเป็นเช่นนั้นฉันก็คงมองพวกเขาเหมือนกวางในไฟหน้า แล้วทำไม / เมื่อไหร่หล่อไม่ดี? เป็นเรื่องทั่วไปสำหรับ java, c #, c ++ หรือทุกสภาพแวดล้อมรันไทม์ที่แตกต่างกันจัดการกับเงื่อนไขของมันเองหรือไม่? ยินดีต้อนรับเฉพาะสำหรับภาษาใด ๆ เช่นทำไมภาษา c ++ จึงไม่ดี
97 c#  java  c++  casting 

4
วิธีใช้ QueryPerformanceCounter
เมื่อเร็ว ๆ นี้ฉันตัดสินใจว่าฉันจำเป็นต้องเปลี่ยนจากการใช้มิลลิวินาทีเป็นไมโครวินาทีสำหรับคลาส Timer ของฉันและหลังจากการวิจัยบางอย่างฉันตัดสินใจว่า QueryPerformanceCounter น่าจะเป็นทางออกที่ปลอดภัยที่สุดของฉัน (คำเตือนBoost::Posixว่าอาจไม่ทำงานบน Win32 API ทำให้ฉันผิดหวังเล็กน้อย) อย่างไรก็ตามฉันไม่แน่ใจว่าจะใช้งานอย่างไร สิ่งที่ฉันกำลังทำคือเรียกGetTicks()ใช้ฟังก์ชัน esque ใด ๆ ที่ฉันใช้และกำหนดให้กับstartingTicksตัวแปรของตัวจับเวลา จากนั้นเพื่อหาระยะเวลาที่ผ่านไปฉันเพิ่งลบค่าส่งคืนของฟังก์ชันออกจากค่าstartingTicksและเมื่อฉันรีเซ็ตตัวจับเวลาฉันก็เรียกฟังก์ชันอีกครั้งและกำหนดค่าเริ่มต้นให้กับมัน น่าเสียดายที่จากรหัสที่ฉันเห็นมันไม่ง่ายเหมือนแค่การโทรQueryPerformanceCounter()และฉันไม่แน่ใจว่าฉันควรจะส่งผ่านอะไรไปเป็นข้อโต้แย้งของมัน
97 c++  windows  timer 

7
โปรแกรมที่มีตัวแปร global ที่เรียกว่า main แทนฟังก์ชัน main ทำงานได้อย่างไร?
พิจารณาโปรแกรมต่อไปนี้: #include <iostream> int main = ( std::cout << "C++ is excellent!\n", 195 ); การใช้ g ++ 4.8.1 (mingw64) บน Windows 7 OS โปรแกรมจะคอมไพล์และทำงานได้ดีการพิมพ์: C ++ ยอดเยี่ยมมาก! ไปที่คอนโซล mainดูเหมือนจะเป็นตัวแปรส่วนกลางแทนที่จะเป็นฟังก์ชัน โปรแกรมนี้จะรันโดยไม่มีฟังก์ชันได้main()อย่างไร รหัสนี้เป็นไปตามมาตรฐาน C ++ หรือไม่ มีการกำหนดพฤติกรรมของโปรแกรมไว้อย่างดีหรือไม่? ฉันยังใช้-pedantic-errorsตัวเลือกนี้ แต่โปรแกรมยังคงรวบรวมและทำงาน

10
วิธีใดที่ดีที่สุดในการตรวจสอบว่ามีไฟล์อยู่ใน C ++ หรือไม่ (ข้ามแพลตฟอร์ม)
ฉันได้อ่านคำตอบแล้วว่าอะไรคือวิธีที่ดีที่สุดในการตรวจสอบว่ามีไฟล์อยู่ใน C หรือไม่ (ข้ามแพลตฟอร์ม)แต่ฉันสงสัยว่ามีวิธีที่ดีกว่านี้โดยใช้ c ++ libs มาตรฐานหรือไม่ โดยเฉพาะอย่างยิ่งโดยไม่ต้องพยายามเปิดไฟล์เลย ทั้งสองอย่างstatและไม่accessสามารถเข้าถึงได้ จะ#includeใช้อะไรดี?
97 c++  file  file-io 

11
ประสิทธิภาพของการกลับมาก่อนกำหนดในฟังก์ชัน
นี่เป็นสถานการณ์ที่ฉันพบบ่อยในฐานะโปรแกรมเมอร์ที่ไม่มีประสบการณ์และฉันสงสัยว่าโดยเฉพาะอย่างยิ่งสำหรับโครงการที่มีความทะเยอทะยานและใช้ความเร็วสูงของฉันฉันกำลังพยายามเพิ่มประสิทธิภาพ สำหรับภาษาหลัก ๆ เช่น C (C, objC, C ++, Java, C # ฯลฯ ) และคอมไพเลอร์ตามปกติฟังก์ชันทั้งสองนี้จะทำงานได้อย่างมีประสิทธิภาพหรือไม่ มีความแตกต่างในโค้ดที่คอมไพล์หรือไม่? void foo1(bool flag) { if (flag) { //Do stuff return; } //Do different stuff } void foo2(bool flag) { if (flag) { //Do stuff } else { //Do different stuff } } โดยทั่วไปแล้วจะมีโบนัส / …

2
Qt รองรับสล็อตเพียวเสมือนจริงหรือไม่?
โครงการ GUI ของฉันในการQtมีจำนวนมากของ "หน้าการตั้งค่า" QWidgetเรียนที่สืบทอดโดยตรงจากทั้งหมด เมื่อเร็ว ๆ นี้ฉันตระหนักว่าคลาสเหล่านี้ทั้งหมดมีช่องคอมมอนส์ 2 ช่อง ( loadSettings()และsaveSettings()) เกี่ยวกับเรื่องนี้ฉันมีสองคำถาม: มันสมเหตุสมผลหรือไม่ที่จะเขียนคลาสนามธรรมพื้นฐานระดับกลาง (ให้ตั้งชื่อBaseConfigurationPage) ด้วยสองช่องนี้เป็นวิธีบริสุทธิ์เสมือนจริง (ทุกหน้าการกำหนดค่าที่เป็นไปได้จะมีสองวิธีนี้เสมอดังนั้นฉันจะตอบว่า "ใช่") ก่อนที่ฉันจะทำการเปลี่ยนแปลงอย่างหนักในโค้ดของฉัน (ถ้าฉันต้อง): Qt รองรับสล็อตเพียวเสมือนจริงหรือไม่? มีอะไรที่ฉันควรระวังหรือไม่? นี่คือตัวอย่างโค้ดที่อธิบายทุกอย่าง: class BaseConfigurationPage : public QWidget { // Some constructor and other methods, irrelevant here. public slots: virtual void loadSettings() = 0; virtual void saveSettings() = 0; …

4
การจัดการหน่วยความจำใน Qt?
ฉันค่อนข้างใหม่สำหรับ Qt และฉันสงสัยเกี่ยวกับสิ่งพื้นฐานบางอย่างเกี่ยวกับการจัดการหน่วยความจำและอายุการใช้งานของวัตถุ ฉันต้องลบและ / หรือทำลายวัตถุของฉันเมื่อใด สิ่งนี้ได้รับการจัดการโดยอัตโนมัติหรือไม่? ในตัวอย่างด้านล่างฉันต้องลบวัตถุใดบ้างที่ฉันสร้าง จะเกิดอะไรขึ้นกับตัวแปรอินสแตนซ์myOtherClassเมื่อmyClassถูกทำลาย จะเกิดอะไรขึ้นถ้าฉันไม่ลบ (หรือทำลาย) วัตถุของฉันเลย? จะเป็นปัญหาต่อหน่วยความจำหรือไม่? MyClass.h class MyClass { public: MyClass(); ~MyClass(); MyOtherClass *myOtherClass; }; MyClass.cpp MyClass::MyClass() { myOtherClass = new MyOtherClass(); MyOtherClass myOtherClass2; QString myString = "Hello"; } อย่างที่คุณเห็นว่านี่เป็นสิ่งที่ค่อนข้างง่ายสำหรับมือใหม่ แต่ฉันจะเรียนรู้เกี่ยวกับเรื่องนี้ด้วยวิธีง่ายๆได้ที่ไหน
97 c++  qt  memory  object 

3
ทำไม sizeof int จึงผิดในขณะที่ sizeof (int) ถูกต้อง
เราทราบดีว่าsizeofเป็นโอเปอเรเตอร์ที่ใช้สำหรับคำนวณขนาดของประเภทข้อมูลและนิพจน์ใด ๆ และเมื่อตัวถูกดำเนินการเป็นนิพจน์คุณสามารถละวงเล็บได้ int main() { int a; sizeof int; sizeof( int ); sizeof a; sizeof( a ); return 0; } การใช้ครั้งแรกsizeofผิดในขณะที่คนอื่นถูก เมื่อคอมไพล์โดยใช้ gcc ข้อความแสดงข้อผิดพลาดต่อไปนี้จะได้รับ: main.c:5:9: error: expected expression before ‘int’ คำถามของฉันคือเหตุใดมาตรฐาน C จึงไม่อนุญาตให้มีการทำงานแบบนี้ จะsizeof intทำให้เกิดความคลุมเครือหรือไม่
97 c++  c  sizeof 

3
การใช้ emit vs การเรียกสัญญาณราวกับว่ามันเป็นฟังก์ชันปกติใน Qt
สมมติว่าฉันมีสัญญาณนี้: signals: void progressNotification(int progress); ฉันเพิ่งเรียนรู้เกี่ยวกับคีย์เวิร์ด emit ใน Qt จนถึงตอนนี้ฉันเคยเรียกใช้สัญญาณโดยเรียกมันเหมือนฟังก์ชันปกติ แทนที่จะเป็น: emit progressNotification(1000 * seconds); ฉันจะเขียน: progressNotification(1000 * seconds); การเรียกพวกเขาแบบนั้นดูเหมือนจะใช้งานได้และสล็อตที่เชื่อมต่อทั้งหมดจะทำงานดังนั้นการใช้คีย์เวิร์ดที่ปล่อยออกมาจะทำให้เกิดพฤติกรรมที่แตกต่างกันหรือเป็นเพียงแค่น้ำตาลในวากยสัมพันธ์?
97 c++  qt 


1
ความหมายของคำว่า "ฟังก์ชันอิสระ" ใน C ++ คืออะไร?
ในขณะที่อ่านเอกสารสำหรับการทดสอบ boost :: ฉันพบคำว่า "ฟังก์ชันฟรี" สิ่งที่ฉันเข้าใจคือฟังก์ชันฟรีคือฟังก์ชันใด ๆ ที่ไม่คืนค่าอะไรเลย (ประเภทการส่งคืนเป็นโมฆะ) แต่หลังจากอ่านเพิ่มเติมดูเหมือนว่าฟังก์ชันฟรีก็ไม่ได้ใช้ข้อโต้แย้งใด ๆ แต่ผมไม่แน่ใจ ทั้งหมดนี้เป็นสมมติฐานของฉัน มีใครกำหนดฟังก์ชันฟรีได้ไหม
97 c++ 

6
เหตุใด std :: initializer_list จึงไม่เป็นภาษาในตัว
เหตุใดจึงไม่มีstd::initializer_listภาษาหลักในตัว สำหรับฉันแล้วดูเหมือนว่ามันเป็นคุณสมบัติที่สำคัญของ C ++ 11 แต่ก็ไม่มีคำหลักที่สงวนไว้ (หรือบางอย่างที่เหมือนกัน) แต่initializer_listเป็นเพียงคลาสเทมเพลตจากไลบรารีมาตรฐานที่มีการแมปพิเศษโดยนัยจากไวยากรณ์รายการวงเล็บปีกกา ใหม่{...}ที่คอมไพเลอร์จัดการ ตอนแรกคิดว่าโซลูชันนี้ค่อนข้างแฮ็ค นี่เป็นวิธีการใช้งานส่วนเพิ่มเติมใหม่ในภาษา C ++: โดยบทบาทโดยปริยายของคลาสเทมเพลตบางคลาสไม่ใช่ภาษาหลักหรือไม่? โปรดพิจารณาตัวอย่างเหล่านี้: widget<int> w = {1,2,3}; //this is how we want to use a class เหตุใดจึงเลือกคลาสใหม่: widget( std::initializer_list<T> init ) แทนที่จะใช้สิ่งที่คล้ายกับแนวคิดเหล่านี้: widget( T[] init, int length ) // (1) widget( T... init ) // (2) widget( std::vector<T> …

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