ใน C ++ ตัวเริ่มต้นของ C-style ถูกแทนที่ด้วยตัวสร้างซึ่งตามเวลาการคอมไพล์สามารถมั่นใจได้ว่ามีการดำเนินการเริ่มต้นที่ถูกต้องเท่านั้น (เช่นหลังจากการเริ่มต้นสมาชิกวัตถุจะสอดคล้องกัน)
เป็นวิธีปฏิบัติที่ดี แต่บางครั้งการเตรียมข้อมูลเบื้องต้นมีประโยชน์เช่นในตัวอย่างของคุณ OOP แก้นี้โดยคลาสนามธรรมหรือรูปแบบการออกแบบ Creational
ในความคิดของฉันการใช้วิธีที่ปลอดภัยนี้ฆ่าความเรียบง่ายและบางครั้งการแลกเปลี่ยนความปลอดภัยอาจมีราคาแพงเกินไปเนื่องจากรหัสง่าย ๆ ไม่จำเป็นต้องมีการออกแบบที่ซับซ้อน
ในฐานะทางเลือกอื่นฉันขอแนะนำให้กำหนดมาโครโดยใช้ lambdas เพื่อทำให้การเริ่มต้นง่ายขึ้นเพื่อให้ดูเหมือนกับสไตล์ C:
struct address {
int street_no;
const char *street_name;
const char *city;
const char *prov;
const char *postal_code;
};
#define ADDRESS_OPEN [] { address _={};
#define ADDRESS_CLOSE ; return _; }()
#define ADDRESS(x) ADDRESS_OPEN x ADDRESS_CLOSE
แมโคร ADDRESS ขยายเป็น
[] { address _={}; /* definition... */ ; return _; }()
ซึ่งสร้างและเรียกแลมบ์ดา พารามิเตอร์มาโครจะถูกคั่นด้วยเครื่องหมายจุลภาคดังนั้นคุณต้องใส่ initializer ไว้ในวงเล็บและเรียกเช่น
address temp_address = ADDRESS(( _.city = "Hamilton", _.prov = "Ontario" ));
คุณสามารถเขียนแมโครเริ่มต้นทั่วไป
#define INIT_OPEN(type) [] { type _={};
#define INIT_CLOSE ; return _; }()
#define INIT(type,x) INIT_OPEN(type) x INIT_CLOSE
แต่สายก็สวยน้อยกว่าเล็กน้อย
address temp_address = INIT(address,( _.city = "Hamilton", _.prov = "Ontario" ));
อย่างไรก็ตามคุณสามารถกำหนดแมโคร ADDRESS โดยใช้แมโคร INIT ทั่วไปได้อย่างง่ายดาย
#define ADDRESS(x) INIT(address,x)