ฟังก์ชั่น Namespace + กับวิธีการคงที่ในชั้นเรียน


290

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

  1. เขียนฟังก์ชั่นเหล่านี้และใส่ไว้ในMyMathเนมสเปซของฉันและอ้างอิงผ่านMyMath::XYZ()
  2. สร้างชั้นเรียนที่เรียกว่าMyMathและทำให้วิธีการเหล่านี้คงที่และอ้างถึงในทำนองเดียวกันMyMath::XYZ()

เหตุใดฉันจึงเลือกหนึ่งรายการเพื่อจัดระเบียบซอฟต์แวร์ของฉัน


4
สำหรับสิ่งหนึ่งเนมสเปซเป็นส่วนเพิ่มเติมล่าสุดของภาษาเมื่อเทียบกับคลาสและวิธีการแบบคงที่ซึ่งอยู่ในภาษาจากเวลาที่ถูกเรียกว่า "C กับคลาส" โปรแกรมเมอร์บางคนอาจคุ้นเคยกับฟีเจอร์เก่า ๆ โปรแกรมเมอร์บางคนอาจใช้คอมไพเลอร์เก่า แค่ $ .02 ของฉัน
รอม

21
@Rom: ถูกต้องเกี่ยวกับ "โปรแกรมเมอร์เก่า" แต่ผิดเกี่ยวกับ "คอมไพเลอร์เก่า" Namespaces นั้นเรียบเรียงอย่างถูกต้องตั้งแต่ eons (ฉันทำงานกับพวกมันด้วย Visual C ++ 6, สืบมาตั้งแต่ปี 1998!) สำหรับ "C กับคลาส" บางคนในฟอรัมนี้ไม่ได้เกิดขึ้นเมื่อเกิดขึ้น: การใช้สิ่งนี้เป็นอาร์กิวเมนต์เพื่อหลีกเลี่ยงคุณลักษณะ C ++ ที่เป็นมาตรฐานและแพร่หลายเป็นสิ่งที่เข้าใจผิด โดยสรุปมีเพียงคอมไพเลอร์ C ++ ที่ล้าสมัยเท่านั้นที่ไม่สนับสนุนเนมสเปซ อย่าใช้เหตุผลเป็นข้ออ้างที่จะไม่ใช้มัน
paercebal

@ paercebal: คอมไพเลอร์โบราณบางส่วนยังคงใช้งานได้ในโลกที่ฝังตัว การไม่รองรับเนมสเปซอาจเป็นหนึ่งในความไม่สะดวกที่เล็กที่สุดที่เราต้องใส่ในขณะที่เขียนโค้ดสำหรับซีพียูเล็ก ๆ ที่ทุกคนมีปฏิสัมพันธ์กับทุกวัน: สเตอริโอ, ไมโครเวฟ, หน่วยควบคุมเครื่องยนต์ในรถของคุณ, สัญญาณไฟจราจร ฯลฯ ชัดเจน: ฉันไม่ได้เรียกร้องให้ไม่ใช้คอมไพเลอร์ที่ดีกว่าและใหม่กว่าทุกที่ Au conrare: ฉันทุกคนมีคุณสมบัติภาษาใหม่ล่าสุด (ยกเว้น RTTI;)) ฉันแค่ชี้ให้เห็นว่ามีแนวโน้มเช่นนี้อยู่แล้ว
โรม

13
@Rom: ในกรณีปัจจุบันผู้เขียนคำถามมีตัวเลือกดังนั้นชัดเจนว่าไม่มีคอมไพเลอร์ของเขา / เธอที่ไม่สามารถรวบรวมรหัสเนมสเปซ และเนื่องจากเป็นคำถามเกี่ยวกับ C ++ จะต้องให้คำตอบ C ++ รวมถึงการกล่าวถึงเนมสเปซและการแก้ปัญหา RTTI หากจำเป็น การให้คำตอบ C หรือคำตอบ C-with-classes-for-ล้าสมัยคอมไพเลอร์อยู่นอกหัวข้อ
paercebal

2
"แค่ $ 0.02 ของฉัน" - มันจะคุ้มค่ามากกว่าถ้าคุณมีหลักฐานของคอมไพเลอร์ C ++ ที่ยังหลงเหลืออยู่ซึ่งไม่สนับสนุนเนมสเปซ "คอมไพเลอร์โบราณบางส่วนยังคงใช้งานอยู่ในโลกฝังตัว" - นี่มันงี่เง่า; "โลกฝังตัว" เป็นการพัฒนาล่าสุดมากกว่า C ++ เนมสเปซ "C กับคลาส" เปิดตัวในปี 1979 นานก่อนที่จะมีใครฝังโค้ด C ลงในทุกสิ่ง "ฉันแค่ชี้ให้เห็นว่ามีแนวโน้มเช่นนี้อยู่" - แม้ว่าจะเป็นเช่นนั้น แต่ก็ไม่มีอะไรเกี่ยวข้องกับคำถามนี้
Jim Balter

คำตอบ:


243

โดยค่าเริ่มต้นใช้ฟังก์ชั่น namespaced

คลาสจะสร้างวัตถุไม่ใช่เพื่อแทนที่เนมสเปซ

ในรหัสเชิงวัตถุ

Scott Meyers เขียนรายการทั้งหมดสำหรับหนังสือ Effective C ++ ของเขาในหัวข้อนี้ "ชอบฟังก์ชั่นที่ไม่ใช่สมาชิกที่ไม่ใช่สมาชิกในฟังก์ชั่นสมาชิก" ฉันพบการอ้างอิงออนไลน์กับหลักการนี้ในบทความจาก Herb Sutter:http://www.gotw.ca/gotw/084.htm

สิ่งสำคัญที่ควรทราบคือ: ในฟังก์ชั่น C ++ ในเนมสเปซเดียวกันกับคลาสที่อยู่ในอินเทอร์เฟซของคลาสนั้น (เนื่องจากADLจะค้นหาฟังก์ชันเหล่านั้นเมื่อแก้ไขการเรียกใช้ฟังก์ชัน)

ฟังก์ชั่น Namespaced เว้นแต่จะประกาศ "เพื่อน" ไม่มีการเข้าถึงภายในของชั้นเรียนในขณะที่วิธีการคงที่มี

ตัวอย่างเช่นนี่หมายความว่าเมื่อคุณรักษาชั้นเรียนของคุณหากคุณต้องการเปลี่ยนรูปแบบภายในของชั้นเรียนคุณจะต้องค้นหาผลข้างเคียงในวิธีการทั้งหมดรวมถึงแบบคงที่

ส่วนขยาย I

การเพิ่มโค้ดให้กับส่วนติดต่อของคลาส

ใน C # คุณสามารถเพิ่มวิธีการในชั้นเรียนแม้ว่าคุณจะไม่สามารถเข้าถึงได้ แต่ใน C ++ นี่เป็นไปไม่ได้

แต่ยังคงอยู่ใน C ++ คุณยังสามารถเพิ่มฟังก์ชันเนมสเปซได้แม้กระทั่งกับคลาสที่มีคนเขียนให้คุณ

ดูจากอีกด้านหนึ่งซึ่งเป็นสิ่งสำคัญเมื่อออกแบบรหัสของคุณเพราะเมื่อใส่ฟังก์ชั่นของคุณในเนมสเปซคุณจะอนุญาตให้ผู้ใช้เพิ่ม / ทำอินเทอร์เฟซของคลาสให้สมบูรณ์

ส่วนขยาย II

ผลข้างเคียงของจุดก่อนหน้าเป็นไปไม่ได้ที่จะประกาศวิธีคงที่ในหลายหัว ทุกวิธีจะต้องประกาศในคลาสเดียวกัน

สำหรับเนมสเปซฟังก์ชันจากเนมสเปซเดียวกันสามารถประกาศได้ในหลายหัว (ฟังก์ชั่นการแลกเปลี่ยนเกือบเป็นมาตรฐานเป็นตัวอย่างที่ดีที่สุด)

ส่วนขยาย III

coolness พื้นฐานของเนมสเปซคือในบางโค้ดคุณสามารถหลีกเลี่ยงการกล่าวถึงมันหากคุณใช้คำสำคัญ "using":

#include <string>
#include <vector>

// Etc.
{
   using namespace std ;
   // Now, everything from std is accessible without qualification
   string s ; // Ok
   vector v ; // Ok
}

string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR

และคุณสามารถ จำกัด "มลภาวะ" ให้เหลือหนึ่งคลาสด้วย:

#include <string>
#include <vector>

{
   using std::string ;
   string s ; // Ok
   vector v ; // COMPILATION ERROR
}

string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR

"รูปแบบ" นี้จำเป็นสำหรับการใช้สำนวนแลกเปลี่ยนที่เกือบจะเป็นมาตรฐาน

และนี่เป็นไปไม่ได้ที่จะทำอย่างไรกับวิธีการคงที่ในชั้นเรียน

ดังนั้นเนมสเปซ C ++ จึงมีความหมายของตัวเอง

แต่มันจะไปไกลกว่านั้นเมื่อคุณสามารถรวม namespaces ในลักษณะที่คล้ายกับการสืบทอด

ตัวอย่างเช่นถ้าคุณมีเนมสเปซ A ที่มีฟังก์ชัน AAA, เนมสเปซ B ที่มีฟังก์ชั่น BBB คุณสามารถประกาศเนมสเปซ C และนำ AAA และ BBB ในเนมสเปซนี้โดยใช้คำหลัก

ข้อสรุป

เนมสเปซใช้สำหรับเนมสเปซ คลาสสำหรับคลาส

C ++ ได้รับการออกแบบเพื่อให้แต่ละแนวคิดมีความแตกต่างกันและมีการใช้แตกต่างกันในกรณีที่แตกต่างกันเพื่อแก้ปัญหาที่แตกต่างกัน

อย่าใช้คลาสเมื่อคุณต้องการเนมสเปซ

และในกรณีของคุณคุณต้องมีเนมสเปซ


คำตอบนี้สามารถใช้ได้กับเธรดด้วยหรือไม่เช่นจะใช้เนมสเปซดีกว่าเมธอดสแตติกสำหรับเธรดหรือไม่
dashesy

3
@dashesy: เนมสเปซกับเมธอดสแตติกไม่มีส่วนเกี่ยวข้องกับเธรดดังนั้นใช่เนมสเปซดีกว่าเนื่องจากเนมสเปซนั้นดีกว่าเมธอดแบบสแตติก หากมีสิ่งใดวิธีการคงที่มีการเข้าถึงตัวแปรสมาชิกระดับดังนั้นพวกเขาจึงมีค่า encapsulation ต่ำกว่า namespaces และการแยกข้อมูลมีความสำคัญยิ่งในการประมวลผลแบบเธรด
paercebal

@ paercebal- ขอบคุณฉันใช้วิธีการเรียนแบบคงที่สำหรับฟังก์ชั่นด้าย ตอนนี้ฉันเข้าใจว่าฉันใช้คลาสเนมสเปซในทางที่ผิดดังนั้นคุณคิดว่าวิธีใดที่ดีที่สุดในการมีหลายเธรดในวัตถุเดียว ฉันได้ถามคำถามนี้ในดังนั้นเกินไปฉันขอบคุณถ้าคุณสามารถหลั่งน้ำตาแสงบาง (ที่นี่หรือในคำถามของตัวเอง)
dashesy

1
@dashesy: ​​คุณกำลังถามปัญหา สิ่งที่คุณต้องการด้วยเธรดที่แตกต่างกันคือการแยกข้อมูลที่ไม่ควรแชร์ดังนั้นการมีหลายเธรดที่มีสิทธิ์การเข้าถึงข้อมูลส่วนตัวของคลาสนั้นเป็นแนวคิดที่ไม่ดี ฉันจะซ่อนหนึ่งเธรดภายในชั้นเรียนและตรวจสอบให้แน่ใจว่าได้แยกข้อมูลสำหรับเธรดนั้นออกจากข้อมูลสำหรับเธรดหลัก แน่นอนว่าข้อมูลที่ควรจะแชร์นั้นสามารถเป็นสมาชิกของคลาสนั้นได้ แต่พวกเขายังควรซิงโครไนซ์ (ล็อค, อะตอมมิก ฯลฯ ) ฉันไม่แน่ใจเกี่ยวกับจำนวน libs ที่คุณสามารถเข้าถึงได้ แต่การใช้งาน / async นั้นดีกว่า
paercebal

คำตอบของ paercebal ควรเป็นคำตอบที่ยอมรับได้! อีกหนึ่งลิงก์สำหรับการแลกเปลี่ยนเกือบมาตรฐาน () ผ่าน namespace + ADL -> stackoverflow.com/questions/6380862//
Gob00st

54

มีคนมากมายที่ไม่เห็นด้วยกับฉัน แต่นี่คือวิธีที่ฉันเห็น:

คลาสนั้นเป็นนิยามของวัตถุชนิดหนึ่ง วิธีการสแตติกควรกำหนดการดำเนินงานที่เชื่อมโยงกับคำนิยามของวัตถุนั้น

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

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

แต่อย่างที่ฉันพูดฉันรู้ว่ามีคนมากมายที่ไม่เห็นด้วยกับฉันเกี่ยวกับเรื่องนี้ (โดยเฉพาะนักพัฒนา Java และ C #)


3
คุณมีมุมมองที่บริสุทธิ์มากในเรื่องนี้ แต่ในทางปฏิบัติพูดชั้นด้วยวิธีการไฟฟ้าสถิตย์ทั้งหมดสามารถเข้ามามีประโยชน์: คุณสามารถtypedefให้พวกเขาใช้พวกเขาเป็นแม่แบบพารามิเตอร์ ฯลฯ
Shog9

56
เพราะคน Jave และ C # ไม่มีทางเลือก
Martin York

7
@ shog9 คุณสามารถเทมเพลฟังก์ชั่นได้เช่นกัน!
Martin York

6
@Dan: สมมุติว่าเป็นสิ่งที่จำเป็นต้องทำตามขั้นตอนทางคณิตศาสตร์และต้องการสนับสนุน "การเสียบใน" การใช้งานที่แตกต่างกัน
Shog9

1
@ แดน: "ฉันคิดว่าถ้าใครสนใจใช้คลาสเป็นพารามิเตอร์เทมเพลตคลาสนั้นก็เกือบจะกำหนดวัตถุต้นแบบอยู่แล้ว" ไม่เลย. คิดถึงลักษณะ ( แต่ผมอย่างเห็นด้วยกับคำตอบของคุณ.)
เอสบีไอ

18
  • หากคุณต้องการข้อมูลคงที่ให้ใช้วิธีการคงที่
  • หากพวกเขากำลังทำหน้าที่แม่แบบและคุณต้องการที่จะสามารถระบุชุดของพารามิเตอร์แม่แบบสำหรับฟังก์ชั่นทั้งหมดเข้าด้วยกันจากนั้นใช้วิธีการคงที่ในชั้นเรียนแม่แบบ

มิฉะนั้นใช้ฟังก์ชั่น namespaced


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

template<typename T, int decimalPlaces>
class MyMath
{
   // routines operate on datatype T, preserving at least decimalPlaces precision
};

// math routines for manufacturing calculations
typedef MyMath<double, 4> CAMMath;
// math routines for on-screen displays
typedef MyMath<float, 2> PreviewMath;

หากคุณไม่ต้องการสิ่งนั้นโดยทั้งหมดให้ใช้เนมสเปซ


2
ข้อมูลแบบสแตติกที่เรียกว่าอาจเป็นข้อมูลระดับเนมสเปซในไฟล์การนำไปใช้ของเนมสเปซซึ่งจะช่วยลดการมีเพศสัมพันธ์ได้มากขึ้นเนื่องจากไม่จำเป็นต้องแสดงในส่วนหัว
Motti

ข้อมูลคงไม่ดีไปกว่า globals ขอบเขตขอบเขต
coppro

@coppro อย่างน้อยหนึ่งก้าวขึ้นสู่ห่วงโซ่วิวัฒนาการจากกลุ่มดาวสุ่มที่พวกเขาสามารถทำให้เป็นส่วนตัว (แต่เห็นด้วยอย่างอื่น)
Martin York

@Motti: OTOH ถ้าคุณต้องการในส่วนหัว (ฟังก์ชั่นอินไลน์ / เทมเพลต) คุณจะกลับมาเป็นคนที่น่าเกลียด
Shog9

1
ตัวอย่างที่น่าสนใจใช้คลาสเป็นแบบย่อเพื่อหลีกเลี่ยงการtemplateขัดแย้งซ้ำ!
underscore_d

13

คุณควรใช้เนมสเปซเนื่องจากเนมสเปซมีข้อดีกว่าคลาส:

  • คุณไม่จำเป็นต้องกำหนดทุกอย่างในส่วนหัวเดียวกัน
  • คุณไม่จำเป็นต้องเปิดเผยการนำไปใช้ทั้งหมดของคุณในส่วนหัว
  • คุณไม่สามารถusingเป็นสมาชิกคลาสได้ คุณสามารถusingเป็นสมาชิกเนมสเปซ
  • คุณทำไม่ได้using classแต่using namespaceไม่ใช่ทั้งหมดที่เป็นความคิดที่ดี
  • การใช้คลาสหมายความว่ามีบางวัตถุที่จะสร้างเมื่อไม่มีจริง ๆ

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


3
"คุณไม่จำเป็นต้องเปิดเผยการนำไปใช้ทั้งหมดของคุณในส่วนหัว" คุณไม่ต้องทำเมื่อคุณใช้คลาส
Vanuan

มากขึ้น: หากคุณกำลังใช้เนมสเปซคุณจะไม่สามารถเปิดเผยการนำไปใช้ทั้งหมดของคุณได้ในส่วนหัว (คุณจะต้องมีสัญลักษณ์หลายคำนิยาม) ฟังก์ชั่นสมาชิกคลาสอินไลน์ช่วยให้คุณทำเช่นนั้น
Vanuan

1
@Vanuan: คุณสามารถแสดงการปรับใช้เนมสเปซในส่วนหัว เพียงใช้inlineคำสำคัญเพื่อตอบสนอง ODR
โทมัส Eding

@ThomasEding ไม่ต้องการ! = can
Vanuan

3
@Vanuan: มีสิ่งเดียวที่รับประกันได้โดยคอมไพเลอร์เมื่อใช้inlineงานและมันไม่ได้เป็น "inlining" เนื้อหาของฟังก์ชั่น วัตถุประสงค์ที่แท้จริง (และรับประกันโดยมาตรฐาน) ของinlineคือเพื่อป้องกันไม่ให้หลายคำจำกัดความ อ่านเกี่ยวกับ "One Definition Rule" สำหรับ C ++ นอกจากนี้คำถาม SO ที่เชื่อมโยงไม่ได้รวบรวมเนื่องจากปัญหาส่วนหัวที่คอมไพล์แล้วแทนที่จะเป็นปัญหา ODR
Thomas Eding

3

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


2
คุณสามารถมีข้อมูลส่วนตัวในเนมสเปซนิรนามในไฟล์การนำไปปฏิบัติพร้อมกับคลาสได้เช่นกัน ไม่แน่ใจว่าฉันทำตามตรรกะของคุณ
แพทริค Johnmeyer

0

อีกหนึ่งเหตุผลในการใช้คลาส - ตัวเลือกเพื่อใช้ประโยชน์จากตัวระบุการเข้าถึง จากนั้นคุณสามารถแบ่งวิธีคงที่สาธารณะเป็นวิธีส่วนตัวขนาดเล็ก วิธีการสาธารณะสามารถเรียกวิธีการส่วนตัวหลาย ๆ


6
ตัวดัดแปลงการเข้าถึงนั้นยอดเยี่ยม แต่แม้privateวิธีส่วนใหญ่จะสามารถเข้าถึงได้มากกว่าวิธีที่ต้นแบบไม่ได้ถูกเผยแพร่ในส่วนหัว (และยังคงมองไม่เห็น) ฉันไม่ได้พูดถึง encapsulation ที่ดีกว่าที่เสนอโดยฟังก์ชั่น namespaced โดยไม่ระบุชื่อ
paercebal

2
เมธอดส่วนตัวคือ IMO ซึ่งด้อยกว่าการซ่อนฟังก์ชันในการนำไปใช้ (ไฟล์ cpp) และไม่เคยเปิดเผยในไฟล์ส่วนหัว โปรดอธิบายอย่างละเอียดในคำตอบของคุณและทำไมคุณถึงต้องการใช้สมาชิกส่วนตัว จนกระทั่งแล้ว -1
nonsensickle

@ nonsensickle บางทีเขาอาจหมายถึงฟังก์ชั่นแมมมอ ธ ที่มีส่วนซ้ำ ๆ มากมายสามารถแบ่งย่อยได้อย่างปลอดภัยในขณะที่ซ่อนส่วนย่อยที่ละเมิดไว้เบื้องหลังส่วนตัวหยุดผู้อื่นจากการเข้ามาหาพวกเขาหากพวกเขามีอันตราย / ต้องการใช้อย่างระมัดระวัง
Troyseph

1
@Troyseph คุณสามารถซ่อนข้อมูลนี้ไว้ในเนมสเปซที่ไม่มีชื่อใน.cppไฟล์ซึ่งจะทำให้เป็นส่วนตัวกับหน่วยการแปลนั้นโดยไม่ให้ข้อมูลที่ไม่จำเป็นแก่ใครก็ตามที่อ่านไฟล์ส่วนหัว อย่างมีประสิทธิภาพฉันพยายามที่จะสนับสนุนสำนวน PIMPL
nonsensickle

คุณไม่สามารถใส่มันลงใน.cppไฟล์หากคุณต้องการใช้เทมเพลต
Yay295

0

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


"[การเก็บสิ่งต่าง ๆ ] ในเนมสเปซนิรนามของไฟล์การนำไปใช้ [คือ] ขอบเขตที่ใหญ่กว่าการมีไว้ในคลาส" - ไม่มันไม่ใช่ ในกรณีที่ไม่จำเป็นต้องใช้สิทธิ์เข้าถึงสมาชิกสิ่งที่กำหนดชื่อโดยไม่ระบุชื่อจะเป็นส่วนตัวมากกว่าprivate:สิ่งอื่น และในหลายกรณีที่ดูเหมือนว่าจำเป็นต้องมีการเข้าถึงแบบพิเศษ ฟังก์ชั่น 'ส่วนตัว' มากที่สุดคือฟังก์ชั่นที่ไม่ปรากฏในส่วนหัว private:วิธีการไม่เคยได้รับประโยชน์นี้
underscore_d
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.