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

22
ตัวสร้างแบบคงที่ใน C ++? ฉันต้องเริ่มต้นวัตถุคงที่ส่วนตัว
ฉันต้องการคลาสที่มีสมาชิกข้อมูลสแตติกส่วนตัว (เวกเตอร์ที่มีอักขระ az ทั้งหมด) ใน java หรือ C # ฉันสามารถสร้าง "static constructor" ที่จะทำงานก่อนที่ฉันจะสร้างอินสแตนซ์ของคลาสและตั้งค่าสมาชิกข้อมูลคงที่ของคลาส มันถูกเรียกใช้เพียงครั้งเดียว (เนื่องจากตัวแปรถูกอ่านอย่างเดียวและจำเป็นต้องตั้งค่าเพียงครั้งเดียว) และเนื่องจากเป็นฟังก์ชันของคลาสจึงสามารถเข้าถึงสมาชิกส่วนตัวได้ ฉันสามารถเพิ่มโค้ดใน Constructor ที่ตรวจสอบเพื่อดูว่าเวกเตอร์เริ่มต้นได้หรือไม่และเริ่มต้นถ้าไม่ใช่ แต่แนะนำการตรวจสอบที่จำเป็นมากมายและดูเหมือนจะไม่เป็นทางออกที่ดีที่สุดสำหรับปัญหา ความคิดเกิดขึ้นกับฉันว่าเนื่องจากตัวแปรจะอ่านได้อย่างเดียวพวกเขาสามารถเป็น const คงที่แบบสาธารณะดังนั้นฉันจึงสามารถตั้งค่าพวกเขาอีกครั้งนอกชั้นเรียน แต่อีกครั้งดูเหมือนว่าแฮ็คที่น่าเกลียด เป็นไปได้หรือไม่ที่จะมีสมาชิกข้อมูลสแตติกส่วนตัวในชั้นเรียนหากฉันไม่ต้องการเริ่มต้นพวกเขาใน Constructor อินสแตนซ์?

5
เหตุใด C # 3.0 object initializer constructor จึงเป็นตัวเลือกเสริม
ดูเหมือนว่าไวยากรณ์ของตัวเริ่มต้นออบเจ็กต์ C # 3.0 จะอนุญาตให้มีหนึ่งในการยกเว้นคู่เปิด / ปิดของวงเล็บในตัวสร้างเมื่อมีตัวสร้างที่ไม่มีพารามิเตอร์อยู่ ตัวอย่าง: var x = new XTypeName { PropA = value, PropB = value }; ตรงข้ามกับ: var x = new XTypeName() { PropA = value, PropB = value }; ฉันสงสัยว่าทำไมคู่ของวงเล็บเปิด / ปิดตัวสร้างจึงเป็นตัวเลือกที่นี่หลังจากนั้นXTypeName?

8
เรียกเมธอด Java โดยไม่มีชื่อ
ฉันดูโค้ดด้านล่างและพบว่ามีบางอย่างแปลก ๆ : public class Sequence { Sequence() { System.out.print("c "); } { System.out.print("y "); } public static void main(String[] args) { new Sequence().go(); } void go() { System.out.print("g "); } static { System.out.print("x "); } } ฉันคาดว่าสิ่งนี้จะทำให้เกิดข้อผิดพลาดในการคอมไพล์เนื่องจากSystem.out"y" ไม่ได้เป็นของการประกาศวิธีการเพียงแค่ a { }. เหตุใดจึงใช้ได้ ฉันไม่เห็นว่ารหัสนี้จะเรียกว่าอย่างไร เมื่อเรียกใช้สิ่งนี้จะสร้างขึ้นx y c gด้วยเหตุใดจึงถูกstatic { }เรียกก่อนตัวสร้างลำดับ
101 java  initializer 

2
Initializer ไม่สามารถเข้าถึงได้เนื่องจากระดับการป้องกัน "ภายใน"
ฉันมีโปรโตคอลบางอย่าง เข้าสู่ระบบกลยุทธ์ public protocol LoginStrategy { func login(_ viewController: UIViewController) func getUserInfo(withCompletionHandler completionHandler: @escaping (_ userInfo: [String: Any]?) -> ()) func createLoginButton(_ frame: CGRect, withCompletionHandler completionHandler: @escaping (_ loginButton: UIView) -> ()) func getUserId() -> String } และสองคลาส: เข้าสู่ระบบ public class LoginProvider { public let strategy: LoginStrategy public func login(_ …

2
การกระโดดข้ามการกำหนดค่าเริ่มต้นของตัวแปรไม่ถูกต้องหรือทำให้เกิดพฤติกรรมที่ไม่ได้กำหนดหรือไม่?
พิจารณารหัสนี้: void foo() { goto bar; int x = 0; bar: ; } GCC และ Clang ปฏิเสธเนื่องจากการข้ามไปยังการbar:ข้ามการกำหนดค่าเริ่มต้นของตัวแปร MSVC ไม่บ่นเลย (ยกเว้นการใช้xหลังจากbar:ทำให้เกิดการเตือน) เราสามารถทำสิ่งเดียวกันด้วยswitch: void foo() { switch (0) { int x = 0; case 0: ; } } ตอนนี้ทั้งสามคอมไพเลอร์ปล่อยข้อผิดพลาด ตัวอย่างเหล่านั้นไม่ดีหรือไม่ หรือพวกเขาทำให้ UB? ฉันเคยคิดว่าทั้งสองรูปแบบไม่ดี แต่ฉันไม่สามารถหาส่วนที่น่ารำคาญของมาตรฐาน [stmt.goto]ไม่ได้พูดอะไรเกี่ยวกับเรื่องนี้และไม่ไม่[stmt.select]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.