ข้อผิดพลาด: อาร์กิวเมนต์เริ่มต้นที่กำหนดสำหรับพารามิเตอร์ 1


97

ฉันได้รับข้อความแสดงข้อผิดพลาดพร้อมรหัสด้านล่าง:

class Money {
public:
    Money(float amount, int moneyType);
    string asString(bool shortVersion=true);
private:
    float amount;
    int moneyType;
};

ก่อนอื่นฉันคิดว่าไม่อนุญาตให้ใช้พารามิเตอร์เริ่มต้นเป็นพารามิเตอร์แรกใน C ++ แต่ได้รับอนุญาต


คุณช่วยให้รายละเอียดเพิ่มเติมได้ไหม
Etienne de Martel

ฉันใช้ Eclipse CDT กับ MinGW 5.1.6 บน Windows
โกโก้

คำตอบ:


223

คุณอาจกำลังกำหนดค่าพารามิเตอร์เริ่มต้นใหม่ในการใช้ฟังก์ชัน ควรกำหนดไว้ในการประกาศฟังก์ชันเท่านั้น

//bad (this won't compile)
string Money::asString(bool shortVersion=true){
}

//good (The default parameter is commented out, but you can remove it totally)
string Money::asString(bool shortVersion /*=true*/){
}

//also fine, but maybe less clear as the commented out default parameter is removed
string Money::asString(bool shortVersion){
}

1
ตอนนี้มันบอกว่า: string Money :: asString () 'ไม่ตรงกับใด ๆ ในคลาส `` Money'
pocoa

1
@pocoa คุณยังคงต้องเก็บbool shortVersionพารามิเตอร์ไว้เพียงแค่ลบหรือแสดงความคิดเห็น= true
Yacoby

@Yacoby: ขอบคุณคุณพูดถูก ไม่เข้าท่าเลยสับสนมาก
pocoa

7
@pocoa: จริงๆแล้วมันก็สมเหตุสมผลนะ ถ้าคุณให้เป็นค่าเริ่มต้นสำหรับพารามิเตอร์เหล่านี้จะเติมเต็มในที่โทร ดังนั้นพวกเขาจึงต้องอยู่ในการประกาศของฟังก์ชันเพราะนี่คือสิ่งที่ผู้เรียกต้องเห็น หากคุณต้องทำซ้ำตามคำจำกัดความมันจะซ้ำซ้อนและยุ่งยากมากขึ้นในการดูแลรักษา (นี่เป็นสาเหตุที่ฉันไม่เห็นด้วยกับ Yacoby เกี่ยวกับการแสดงความคิดเห็นเกี่ยวกับพารามิเตอร์เริ่มต้นในการใช้งาน IME ในโครงการจริงความคิดเห็นดังกล่าวจะไม่ตรงกับคำประกาศไม่ช้าก็เร็ว
sbi

1
std::string Money::asString(bool)ความหมายที่แท้จริงคือ โปรดทราบว่าไม่มีแม้แต่ชื่อของพารามิเตอร์ และแน่นอนคุณสามารถใช้ชื่ออื่นในการประกาศมากกว่าในคำจำกัดความ (สิ่งนี้มีความสำคัญในโครงการขนาดใหญ่เมื่อไม่ว่าด้วยเหตุผลใดก็ตาม - คุณต้องการเปลี่ยนชื่อในคำจำกัดความ แต่ไม่ต้องการคอมไพล์โค้ดนับล้านบรรทัดใหม่ซึ่งขึ้นอยู่กับการประกาศ)
SBI
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.