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

คำถามเกี่ยวกับ C ++ ซึ่งเป็นภาษาการเขียนแบบสแตติกแบบหลายกระบวนทัศน์รวบรวมภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไป

2
มันเป็นการปฏิบัติที่ไม่ถูกต้องหรือไม่ที่จะสร้างบล็อคของรหัส?
ใน C ++ มันเป็นวิธีปฏิบัติที่ไม่ถูกต้องหรือไม่ในการสร้างบล็อกของโค้ดภายในฟังก์ชั่นบางอย่างเช่นต่อไปนี้: bool f() { { double test = 0; test = // some other variable outside this function, for example. if (test == // some value) return true; } { double test = 0; test = // some variable outside this function, different from the last one. …

2
วิธีทดสอบและการใช้งาน mutex มาตรฐาน
ตามที่ชื่อบอกไว้: คุณจะทดสอบและเปรียบเทียบการใช้งาน mutexes ใน c ++ อย่างไร? โดยพื้นฐานแล้วฉันเขียน std :: mutex เหมือนคลาสสำหรับโครงการที่รันบน 2 คอร์ armv7 โดยมีจุดประสงค์เพื่อลดค่าใช้จ่ายในกรณีที่ไม่มีการโต้แย้ง ตอนนี้ฉันกำลังพิจารณาใช้ mutex ที่กล่าวไว้ในที่ต่าง ๆ และสถาปัตยกรรมที่แตกต่างกัน แต่ก่อนที่ฉันจะทำสิ่งนี้ มันถูกต้องจริง ไม่มีกรณีพยาธิวิทยาใดที่มันทำงานได้แย่กว่า std มาตรฐาน :: mutex มาก เห็นได้ชัดว่าฉันเขียนการทดสอบหน่วยพื้นฐานและมาตรฐานไมโครและทุกอย่างดูเหมือนจะทำงาน แต่ในรหัสแบบมัลติเธรด "ดูเหมือนจะทำงาน" ไม่ได้ให้ความสะดวกสบายมาก ดังนั้นมีเทคนิคการวิเคราะห์แบบคงที่หรือแบบไดนามิกหรือไม่? ข้อผิดพลาดทั่วไปเมื่อเขียนการทดสอบหน่วยสำหรับคลาส mutex คืออะไร สิ่งที่ขอบกรณีทั่วไปควรระวัง (ประสิทธิภาพฉลาด) คืออะไร? ฉันใช้ไลบรารีมาตรฐานชนิดสำหรับการใช้งานเท่านั้นซึ่งรวมถึงการดำเนินการโหลดและจัดเก็บที่ไม่ต่อเนื่องตามลำดับบน atomics อย่างไรก็ตามฉันสนใจที่จะแนะนำการใช้งานแบบไม่เชื่อเรื่องพระเจ้าเนื่องจากฉันต้องการใช้ชุดทดสอบที่เหมือนกันสำหรับการใช้งานอื่นเช่นกัน
12 c++  testing  mutex 

5
อะไรคือความแตกต่างทางแนวคิดระหว่างสุดท้ายและผู้ทำลายล้าง
ก่อนอื่นฉันตระหนักดีว่าเหตุใดจึงไม่มีการสร้าง 'ที่สุด' ใน C ++ แต่การอภิปรายความคิดเห็นที่เพิ่มขึ้นอย่างต่อเนื่องในคำถามอื่นดูเหมือนจะรับประกันคำถามแยกต่างหาก นอกเหนือจากปัญหาที่finallyใน C # และ Java สามารถมีอยู่ได้เพียงครั้งเดียว (== 1) ต่อขอบเขตและขอบเขตเดียวสามารถมี destructors C ++ หลายตัว (== n) ฉันคิดว่ามันเป็นสิ่งเดียวกัน (ด้วยความแตกต่างทางเทคนิค) อย่างไรก็ตามผู้ใช้คนอื่นแย้ง : ... ฉันพยายามที่จะบอกว่า dtor เป็นเครื่องมือสำหรับ (sematics ที่วางจำหน่าย) และในที่สุดก็เป็นเครื่องมือสำหรับ (Commit semantics) หากคุณไม่เห็นสาเหตุ: ลองคิดดูว่าทำไมการโยนข้อยกเว้นทับซ้อนทับกันในที่สุดก็เป็นเรื่องถูกกฎหมายและทำไมสิ่งเดียวกันถึงไม่ได้สำหรับผู้ทำลายล้าง (ในบางแง่มันเป็นข้อมูลเทียบกับสิ่งควบคุม Destructors สำหรับการปล่อยข้อมูลในที่สุดก็เพื่อปล่อยการควบคุมพวกมันต่างกันโชคไม่ดีที่ C ++ เชื่อมโยงพวกเขาเข้าด้วยกัน) มีคนล้างข้อมูลนี้ได้ไหม

3
ตัวชี้ที่ไม่ใช่ตัวเลือกเทียบกับการอ้างอิงที่ไม่ใช่แบบ const ใน C ++
ในคุณสมบัติ C ++ อื่น ๆ , อาร์กิวเมนต์อ้างอิงของคู่มือสไตล์ Google C ++ , ฉันอ่านว่าต้องไม่ใช้การอ้างอิงที่ไม่ใช่ const พารามิเตอร์ทั้งหมดที่ส่งผ่านโดยการอ้างอิงจะต้องระบุว่า const เป็นที่ชัดเจนว่าการดูการเรียกใช้ฟังก์ชันที่ใช้การอ้างอิงเป็นอาร์กิวเมนต์ทำให้ผู้เขียนโปรแกรม C สับสน แต่ C และ C ++ เป็นภาษาที่แตกต่างกันในขณะนี้ หากจำเป็นต้องใช้พารามิเตอร์เอาต์พุตโดยใช้ตัวชี้สำหรับพารามิเตอร์เอาต์พุตที่ต้องการอาจทำให้ฟังก์ชันการทำงานทั้งหมดถูกข้ามไปซึ่งทำให้การใช้งานฟังก์ชั่นมีความซับซ้อนมากขึ้น (เพิ่มความซับซ้อนของวงจรและความลึกของฟังก์ชัน) ฉันต้องการสร้างรหัส C ++ ให้เข้าใจและบำรุงรักษาได้ง่ายที่สุดดังนั้นโดยทั่วไปฉันสนใจที่จะอ่านคู่มือการเขียนโค้ดสไตล์ แต่เพื่อปรับแนวทางปฏิบัติที่ดีที่สุดในทีมฉันคิดว่าความเข้าใจเหตุผลเบื้องหลังองค์ประกอบของแนวทางนำเสนอเป็นปัจจัยสำคัญ การอ้างอิงที่ไม่ใช่ const นั้นแย่จริง ๆ หรือไม่? การห้ามเฉพาะ Google เท่านั้นหรือเป็นกฎที่ยอมรับกันโดยทั่วไปหรือไม่ อะไรคือเหตุผลของความพยายามพิเศษสำหรับการใช้พารามิเตอร์เอาต์พุตเป็นพอยน์เตอร์?

2
วิธีจัดการกับการเปลี่ยนแปลงการออกแบบสำหรับการเลิกใช้งาน auto_ptr ใน C ++ 11 ได้อย่างไร
เรากำลังทดสอบห้องสมุดภายใต้ C ++ 11 (เช่น-std=c++11) ห้องสมุดใช้auto_ptrและรูปแบบนี้: Foo* GetFoo() { autoptr<Foo> ptr(new Foo); // Initialize Foo ptr->Initialize(...); // Now configure remaining attributes ptr->SomeSetting(...); return ptr.release(); } เลิกใช้ C ++ 11 auto_ptrดังนั้นเราต้องการย้ายออกไป อย่างไรก็ตามรหัสสนับสนุนทั้ง C ++ 03 และ C ++ 11 จึงไม่ง่ายที่เป็น auto_ptryanking นอกจากนี้ยังมีมูลค่าการกล่าวถึงห้องสมุดที่ไม่มีการอ้างอิงภายนอก มันใช้ C ++ 03; และไม่ใช้ Autotools, Cmake, Boost, ... …
12 design  c++  c++11 

1
การจัดระเบียบไดเรกทอรีของที่เก็บ CMake (C ++) ที่มีหลายโครงการ
ฉันต้องการคำแนะนำเกี่ยวกับองค์กรของชุดโครงการ C ++ ที่เกี่ยวข้อง แต่เป็นอิสระที่เก็บไว้ในที่เก็บ (git) เดียว โครงการใช้ CMake สำหรับตัวอย่างที่ง่ายเรานึกภาพ 2 โครงการ A และ B ขึ้นอยู่กับ B. คนส่วนใหญ่ที่พัฒนา A จะได้รับ B ผ่านระบบบรรจุภัณฑ์ ดังนั้นพวกเขาจะรวบรวมเพียง A. อย่างไรก็ตามเราควรอนุญาตให้นักพัฒนาคอมไพล์ทั้ง A และ B เอง (และติดตั้ง) แยกกันหรือรวมกัน นี่คือข้อเสนอ: └── Repo1 ├── CMakeLists.txt (1) ├── A │ ├── CMakeLists.txt (2) │ ├── include │ │ ├── aaa.h …

4
ฟังก์ชั่นสมาชิกกับฟังก์ชั่นที่ไม่ใช่สมาชิกสำหรับผู้ประกอบการคณิตศาสตร์
ฉันกำลังเขียนห้องสมุดพีชคณิตเชิงเส้น (เรื่องสั้นสั้น ๆ มันเป็นโรงเรียนที่ได้รับมอบหมาย) ที่เกี่ยวข้องกับเมทริกซ์เวกเตอร์ ฯลฯ ในกระบวนการสร้างห้องสมุดนี้ฉันจะต้องสร้างฟังก์ชั่นที่ดำเนินการทางคณิตศาสตร์กับวัตถุ ตัวอย่างเช่น transpose matrix, invert matrix, normalize vector และอื่น ๆ ฉันสงสัยว่า "วิธีปฏิบัติที่ดีที่สุด" สำหรับฟังก์ชั่นประเภทนี้คืออะไรนั่นคือฉันควรทำให้ฟังก์ชั่นเป็นฟังก์ชันสมาชิกหรือไม่เป็นสมาชิกหรือไม่? (เพื่อความชัดเจน / ใช้ประโยชน์สาเก) ตัวอย่าง: //Member function way: B = A.transpose(); C = A.inverse(); //Non-member function way: B = linalg::transpose(A); //Non-member transpose function in linear algebra namespace C = linalg::inverse(A); มีมาตรฐานเกี่ยวกับการดำเนินการหลายประเภทบ้างไหม? หรืออย่างน้อยก็มีวิธีธรรมดา …
12 c++  libraries  methods 

3
ฉันควรทำเครื่องหมายประเภทในโปรแกรม C และ C ++ อย่างไร
ในคำตอบของฉันฉันใช้_tเมื่อสิ้นสุดประเภทซึ่งจบลงอย่างดีที่สุดแย้ง นี่คือแนวทางปฏิบัติที่ฉันใช้ในโครงการปัจจุบันของฉัน typedef struct { int x; int y; } point_t; ครั้งนี้มีวัตถุประสงค์เพื่อให้สอดคล้องกับประเภท C จากstddef.hชอบหรือsize_t ptrdiff_tอย่างไรก็ตามตามความคิดเห็นบางอย่างในคำถามของฉัน_tpostfix ดูเหมือนจะถูกสงวนไว้สำหรับ POSIX ฉันควรใช้อะไรแทน_t? หรือฉันควรใช้_tต่อไปหรือไม่? คำถามนี้สำหรับทั้ง C และ C ++ หากภาษาเหล่านี้มีการประชุมที่แตกต่างกันอย่าลังเลที่จะตอบคำถาม
12 c++  c  naming 

3
เป็นไปได้หรือไม่ที่จะคอมไพล์ภาษาระดับสูงขึ้นเพื่อให้สามารถอ่าน C ++ ได้? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน6 ปีที่ผ่านมา C ++ เป็นภาษาที่ยอดเยี่ยมในหลาย ๆ ด้าน แต่บางสิ่งที่ยุ่งยากในการเขียนโดยไม่ต้องใช้ IDE ในฐานะผู้ใช้ VIM มันน่าสนใจมากถ้าฉันสามารถใช้ภาษาระดับสูงขึ้นซึ่งทำให้ฉันสามารถเขียน C ++ ด้วย S-Expressions และอาจมีมาโครคล้าย Lisp ซึ่งทำให้สามารถสร้างโค้ดที่สะอาดได้ในขณะเดียวกันก็หลีกเลี่ยงการเขียน patters เดิม ครั้งแล้วครั้งเล่า. ฉันถาม freenode และทดสอบแนวคิดหลายอย่างเช่นการคอมไพล์ Lisp-> C กับคอมไพเลอร์เช่น ECL และ Bigloo แต่ไม่มีสิ่งใดที่สร้างโค้ด C ที่สะอาดเป็นพิเศษ มีงานใด ๆ ในปัญหานี้หรือไม่?

5
วิธีการย้ายความคิดของฉันจาก C ++ ไปยัง C #
ฉันเป็นนักพัฒนา C ++ ที่มีประสบการณ์ฉันรู้ภาษาอย่างละเอียดและใช้คุณสมบัติบางอย่างของมันอย่างเข้มข้น นอกจากนี้ฉันรู้หลักการของ OOD และรูปแบบการออกแบบ ตอนนี้ฉันเรียนรู้ C # แต่ฉันไม่สามารถหยุดความรู้สึกที่ไม่สามารถกำจัดความคิด C ++ ได้ ฉันผูกตัวเองอย่างหนักเพื่อจุดแข็งของ C ++ ที่ฉันไม่สามารถอยู่ได้หากไม่มีคุณสมบัติบางอย่าง และฉันไม่สามารถหาวิธีแก้ปัญหาที่ดีสำหรับพวกเขาได้ใน C # อะไรแนวปฏิบัติที่ดี , รูปแบบการออกแบบ , สำนวนที่มีความแตกต่างกันใน C # จากมุมมองของ C ++ คุณสามารถแนะนำ? วิธีการได้รับการออกแบบ C ++ ที่สมบูรณ์แบบไม่ได้ดูโง่ใน C # โดยเฉพาะฉันไม่สามารถหาวิธีที่ดีในการจัดการกับ C # (ตัวอย่างล่าสุด): การควบคุมอายุการใช้งานของทรัพยากรที่ต้องมีการล้างข้อมูลที่กำหนด (เช่นไฟล์) นี่เป็นเรื่องง่ายที่มีusingอยู่ในมือ แต่จะใช้งานได้อย่างไรเมื่อมีการถ่ายโอนความเป็นเจ้าของทรัพยากร [... betwen threads]? ใน …

8
การเขียนซอฟต์แวร์ง่ายกว่าการอ่านและทำความเข้าใจตั้งแต่เริ่มต้นหรือไม่? [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้มีแนวโน้มที่จะเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน6 ปีที่ผ่านมา ฉันและเพื่อนของฉันกำลังคุยกันเรื่องวานนี้เกี่ยวกับความแตกต่างระหว่างการเขียนซอฟต์แวร์ C ++ ขนาดใหญ่และเข้าใจว่าเป็นการรับสมัครใหม่ เป็นไปได้ไหมว่าเมื่อซอฟต์แวร์ทำทีละบรรทัดและกระบวนการนี้คล้ายกับว่าเรา (มนุษย์) เรียนรู้สิ่งต่าง ๆ และสร้างสิ่งที่อยู่เหนือสิ่งอื่นการเขียนซอฟต์แวร์ขนาดใหญ่นั้นง่ายกว่าการอ่านและเข้าใจสิ่งที่มันทำ (การก้าวผ่านโค้ดช่วย แต่คุณต้องจำหลายคลาส / ไฟล์ต้นฉบับด้วยกันคุณไม่รู้ด้วยซ้ำว่าพวกมันถูกเขียนเพื่ออะไร มันฟังดูแปลกในตอนแรก แต่หลังจากที่เราคิดไปเล็กน้อยมันก็สมเหตุสมผล

4
เป็นไปได้ไหมที่จะใช้คอมไพเลอร์ Intel C / C ++ บน Linux เพื่อสร้างไฟล์ออบเจ็กต์ที่จะเชื่อมโยงกับ Windows
ทำไม? ขึ้นอยู่กับแหล่งที่มาของคุณคอมไพเลอร์ของ Intel น่าจะเป็นหรือคอมไพเลอร์ที่สร้างไฟล์ปฏิบัติการที่เร็วที่สุดสำหรับสถาปัตยกรรม x86 (ปรับปรุง 5 ถึง 100% เวลาในการประมวลผล) Intel เสนอคอมไพเลอร์สำหรับ Linux ภายใต้ใบอนุญาตที่ไม่ใช่เชิงพาณิชย์ฟรี (ฉันคิดว่าฉันอ่านมันฟรีที่ใดที่หนึ่งบนหน้าเว็บของพวกเขา: Intel - การพัฒนาซอฟต์แวร์ที่ไม่ใช่เชิงพาณิชย์ ) นอกจากนี้ยังมีใบอนุญาตที่ไม่ใช่เชิงพาณิชย์สำหรับนักเรียนฟรี แต่ใบอนุญาตนี้ไม่สามารถใช้ได้แม้ว่าจะมีเครื่องมือสำหรับระบบปฏิบัติการหลักทั้งสาม (การเชื่อมโยงหลุดเนื่องจากข้อ จำกัด ด้านชื่อเสียง) เป้าหมาย ฉัน (ในฐานะนักเรียนที่ไม่ใช่นักศึกษา) ต้องการใช้คอมไพเลอร์ของ Intel สำหรับการปรับปรุงความเร็วในการดำเนินการที่เป็นไปได้ภายใต้ใบอนุญาตที่ไม่ใช่เชิงพาณิชย์เพื่อรวบรวมไฟล์วัตถุที่สามารถเชื่อมโยงเพื่อสร้างไฟล์ประมวลผลและไลบรารีลิงค์แบบไดนามิกสำหรับ Windows X) รายละเอียดเพิ่มเติม: สิ่งที่ฉันอนุมานจากเอกสารนี้คือคอมไพเลอร์ Intel สร้างออบเจ็กต์ไฟล์ที่เข้ากันได้กับคอมไพเลอร์ที่โดดเด่นของแพลตฟอร์ม Sub-คำถาม: รูปแบบไฟล์ออบเจ็กต์ของ gcc, g ++, cl, mingw32, icc, icpc, และ icl บน Windows และ …

6
OO Design, วิธีสร้างแบบจำลอง Tonal Harmony?
ฉันเริ่มเขียนโปรแกรมใน C ++ 11 ที่จะวิเคราะห์คอร์ดเครื่องชั่งและความสามัคคี ปัญหาที่ใหญ่ที่สุดที่ฉันมีในขั้นตอนการออกแบบของฉันคือโน้ต 'C' คือโน้ตประเภทของคอร์ด (Cmaj, Cmin, C7, ฯลฯ ) และประเภทของคีย์ (คีย์ของ Cmajor, Cminor) ปัญหาเดียวกันเกิดขึ้นกับช่วงเวลา (เล็กน้อย 3, ใหญ่ 3) ฉันใช้คลาสพื้นฐานโทเค็นซึ่งเป็นคลาสพื้นฐานสำหรับ 'สัญลักษณ์' ทั้งหมดในโปรแกรม ตัวอย่างเช่น: class Token { public: typedef shared_ptr<Token> pointer_type; Token() {} virtual ~Token() {} }; class Command : public Token { public: Command() {} pointer_type execute(); …

2
FP สำหรับการจำลองและการสร้างแบบจำลอง
ฉันกำลังจะเริ่มโครงการจำลองสถานการณ์ / การสร้างแบบจำลอง ฉันรู้อยู่แล้วว่า OOP ใช้สำหรับโครงการประเภทนี้ อย่างไรก็ตามการเรียน Haskell ทำให้ฉันพิจารณาใช้กระบวนทัศน์ของ FP สำหรับการสร้างแบบจำลองระบบของส่วนประกอบ ให้ฉันทำอย่างละเอียด: สมมติว่าฉันมีองค์ประกอบประเภท A ซึ่งมีลักษณะเป็นชุดข้อมูล (พารามิเตอร์เช่นอุณหภูมิหรือความดัน PDE และเงื่อนไขขอบเขต ฯลฯ ) และส่วนประกอบประเภท B ซึ่งมีชุดข้อมูลแตกต่างกัน (แตกต่างกัน หรือพารามิเตอร์เดียวกัน PDE และเงื่อนไขขอบเขตที่แตกต่างกัน) สมมติว่าฟังก์ชั่น / วิธีการที่จะนำไปใช้กับแต่ละองค์ประกอบเหมือนกัน (ตัวอย่างวิธี Galerkin) สถานะที่ไม่แน่นอนของวัตถุจะถูกใช้สำหรับพารามิเตอร์ที่ไม่คงที่ ถ้าฉันจะใช้วิธีการของ OOP ฉันจะสร้างวัตถุสองชนิดที่จะห่อหุ้มข้อมูลของแต่ละประเภทวิธีการในการแก้ไข PDE (การสืบทอดจะใช้ที่นี่เพื่อนำโค้ดกลับมาใช้ใหม่) และวิธีแก้ปัญหากับ PDE ในทางตรงกันข้ามถ้าฉันจะใช้วิธีการ FP แต่ละองค์ประกอบจะถูกแบ่งออกเป็นส่วนข้อมูลและฟังก์ชั่นที่จะดำเนินการกับข้อมูลเพื่อให้ได้โซลูชั่นสำหรับ PDE พารามิเตอร์ที่ไม่คงที่จะถูกส่งผ่านเป็นฟังก์ชั่นของอย่างอื่น (เวลาเช่น) หรือแสดงโดยความไม่แน่นอนบางอย่าง (การเลียนแบบความไม่แน่นอน ฯลฯ ) …

2
การออกแบบ API ไลบรารี C ++
ฉันกำลังมองหาแหล่งข้อมูลที่ดีสำหรับการเรียนรู้เกี่ยวกับการออกแบบ API ที่ดีสำหรับไลบรารี C ++, การดูออบเจกต์ร่วม / dll เป็นต้นมีทรัพยากรมากมายในการเขียน API ที่ดี, คลาสที่ดี, เทมเพลตและอื่น ๆ ในระดับซอร์ส วางสิ่งต่าง ๆ เข้าด้วยกันใน libs และ executables ที่ใช้ร่วมกัน หนังสือเช่นการออกแบบซอฟต์แวร์ C ++ ขนาดใหญ่โดย John Lakos มีความน่าสนใจ แต่ล้าสมัยอย่างมาก สิ่งที่ฉันกำลังมองหาคือคำแนะนำเช่นในการจัดการแม่แบบ ด้วยเทมเพลตใน API ของฉันฉันมักจะจบลงด้วยรหัสห้องสมุดในแฟ้มที่ปฏิบัติการได้ของฉัน (หรือไลบรารีอื่น ๆ ) ดังนั้นถ้าฉันแก้ไขข้อบกพร่องที่นั่นฉันไม่สามารถเปิดไลบรารีใหม่ได้ แต่ต้องคอมไพล์ใหม่และแจกจ่ายลูกค้าทั้งหมดของรหัสนั้น (และใช่ฉันรู้วิธีแก้ปัญหาบางอย่างเช่นพยายามสร้างอินสแตนซ์ที่พบบ่อยที่สุดในห้องสมุดเป็นต้น) ฉันกำลังมองหาคำเตือนและข้อควรระวังอื่น ๆ เพื่อรักษาความเข้ากันได้ของไบนารีในขณะที่ทำงานกับไลบรารี C ++ มีเว็บไซต์หรือหนังสือที่ดีในเรื่องดังกล่าวหรือไม่?

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