มันเป็นเรื่องปกติไหมที่จะใช้ตัวสร้างปริยาย


14

ถามเฉพาะเกี่ยวกับตัวสร้างเริ่มต้น

ระบุว่าตัวสร้างเริ่มต้นข้อมูลทั้งหมดสำหรับวัตถุถ้าฉันสร้างคลาสที่ไม่สามารถใช้โดยไม่ต้องเริ่มต้นที่เหมาะสมมันไม่ใช่กรณีที่นวกรรมิกเริ่มต้นไม่มีประโยชน์หรือไม่ พิจารณา:

// A class for handling lines in a CSV file
class CSV_Entry {
private:
    unsigned num_entries;
    std::string string_version;
    std::vector<std::string> vector_version;
    ...etc
public:
    CSV_Entry();
    CSV_Entry(const std::string& src_line);

    // returns a vector copy of the original entry
    std::vector<std::string> get_vector_snapshot();
}

int main( void ) {
    ...etc

    CSV_Entry example = CSV_Entry();
    std::vector<std::string> current_entry = example.get_vector_snapshot();

    ...etc
}

ตัวแปรcurrent_entryนั้นไม่มีประโยชน์เลยใช่ไหม? หากมีคนพยายามประมวลผลในภายหลังพวกเขาอาจจะได้รับข้อผิดพลาด จากนั้นพวกเขาจะสร้างรหัสเพื่อจัดการข้อผิดพลาดดังกล่าว ...

เพื่อลดรหัสเพิ่มเติมที่ไม่จำเป็นดังกล่าว: ทำไมไม่ทำให้ Constructor เริ่มต้นใช้งานไม่ได้ เช่นนั้น

...etc

CSV_Entry() {
    throw Verbose_Exception( "CSV_Entry: do not use the default constructor" );
}

...etc

PS: ในหมายเหตุข้างถ้ามันเป็นเพียงการสร้างคอนสตรัคค่าเริ่มต้นใช้งานไม่ได้มันเป็นเรื่องดีที่จะโยนมันลงในส่วนหัว

คำตอบ:


34

ใช่มันดี (จริง ๆ แล้วมันดี ) เพื่อให้ตัวสร้างค่าเริ่มต้นใช้ไม่ได้หากไม่มีวิธีที่เหมาะสมในการเริ่มต้นวัตถุโดยไม่มีข้อโต้แย้งใด ๆ แต่อย่า "ปิดการใช้งาน" โดยการโยนข้อยกเว้น ทำให้เป็นส่วนตัวแทน โดยหลักการแล้วอินเทอร์เฟซของคุณจะไม่มีวิธีการหรือผู้สร้าง "ที่ไม่ควรเรียก"


1
ดังนั้นโดยทำให้เป็นส่วนตัวผู้ใช้พยายามใช้ตัวสร้างเริ่มต้นจะได้รับข้อผิดพลาดในเวลารวบรวม?
user2738698

@ user2738698 ถูกต้อง
Doval

8
หากคุณสามารถใช้ C ++ 11 ให้ทำเครื่องหมายอย่างชัดเจนว่าถูกลบ: CSV_Entry() = delete;.
bstamour

13
จริงๆแล้วมันไม่ง่ายกว่านี้อีกใช่ไหม หากมีการกำหนดตัวสร้างที่ไม่ใช่ค่าเริ่มต้นคอมไพเลอร์จะไม่สร้างปริยายตัวสร้างเริ่มต้น คลาสนี้มีคอนสตรัคเตอร์ที่ไม่ใช่ค่าเริ่มต้นที่กำหนดไว้ (ซึ่งฉันอยากจะแนะนำexplicitคือ BTW) ดังนั้นหากคุณไม่ได้กำหนดมันจะไม่อยู่
Fred Larson

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