| >>เริ่มเขียนภาษาซีกัน<< เราจะเข้าสู่การเขียนโปรแกรมเชิงวัตถุ ซึ่งเป็นที่นิยมในการเขียนโปรแกรม และสร้างความยุ่งยากให้กับโปรแกรมเมอร์มือใหม่ยิ่งนัก เพราะการเขียนโปรแกรมแบบ OOP จะเขียนแบบสืบทอดกันระหว่าง สกุลต้นแบบและต่อสกุลไปเรื่อยๆ ไม่มีสิ้นสุด ทำงานโดยผ่านเวอร์ช่วนฟังค์ชั่น สามารถใช้ข้อมูลและความสามารถที่มีของสกุลต้นได้ สามารถกำหนดคุณสมบัติเพื่อปกป้องได้ เอาเป็นว่าตามความเข้าใจของผม มันก็แค่การเขียน struct มาตัวนึง มี field ต่างๆ แล้วเราก็เขียนฟังค์ชั่นจัดการข้อมูลภายใน struct เอง สามารถกำหนดขอบเขตการทำงานได้ และพิเศษกับฟังค์ชั่นแบบเสมือนซึ่ง จะอธิบายต่อไป เรามาดูโครงสร้างก่อนที่จะเป็น OOP กันครับ (เครื่องหมายจุดๆ ให้คิดว่าเป็นตัวว่างนะครับ) |
| typedef struct TData // <--------- กำหนดโครงสร้างชื่อ TData{ . . . . . .char data[51]; //<------ กำหนด Field ชื่อ data }; class CData //<------ กำหนด class ชื่อ CData { . . . . . .public: //<------- ประกาศว่าข้อมูลหลังจากนี้สามารถใช้ร่วมกันได้แบบสาธารณะ . . . . . . . . .char data[51]; }; |
| . . . . . .จากตัวอย่างข้างบน TData เป็นตัวแปรแบบ struct มี field ชื่อ data เป็นการเขียนแบบ C ธรรมดา ถ้าจะทำเป็นแบบ OOP ก็เปลี่ยนจาก struct เป็น class และการกำหนดตัวอักษรนำหน้าก็เปลี่ยนจาก T เป็น C ตรงนี้ไม่ได้เป็นกฎเกณฑ์ตายตัว แต่เพื่อความสวยงามและเป็นระเบียนเรียบร้อยเฉยๆครับ และเพิ่มการกำหนดขอบเขต การเข้าถึงข้อมูล เพิ่มข้อความ public เพื่อประกาศว่าข้อมูลหลังจากนี้สามารถใช้งานร่วมกันได้แบบสาธารณะ จะอธิบายรายละเอียดต่อไปเรื่อง public ที่เหลือก็กำหนดข้อมูลแบบเดิมๆครับ |
| . . . . .เพื่อความสมบูรณ์แบบ ผมจะเพิ่มฟังค์ชั่นเข้าไป เพื่อจัดการข้อมูลใน class ครับ |
| class CData //<------ กำหนด class ชื่อ CData{ . . . . . .public: //<------- ประกาศว่าข้อมูลหลังจากนี้สามารถใช้ร่วมกันได้แบบสาธารณะ . . . . . . . . .char data[51]; . . . . . .public: //<------- ประกาศว่าฟังค์ชั่นหลังจากนี้สามารถใช้ร่วมกันได้แบบสาธารณะ . . . . . . . . .CData( ); //<----- Constructor . . . . . . . . .virtual ~CData( ); //<----- Destructor . . . . . . . . .void SetData( char *dt ); . . . . . . . . .void GetData( char *dt ); . . . . . . . . .void ShowData( ); }; |
| . . . . . .ในการเขียน class และใช้งาน class จะมีส่วนการทำงานอัต ตะ โน โม นัด (อัตโนมัติ ฮ่า ฮ่า) อยู่สองส่วนคือ Constructor และ Destructor ดูข้างบนครับ Constructor จะถูกเรียกทันที่เมื่อมีการประกาศใช้งาน class เราต้องตั้งชื่อ Constructor ให้ตรงกับชื่อ class นะครับ ต่อไปส่วนทำงานอัตโนมัติเมื่อเรายกเลิกการทำงานคือ Destructor จะมีเครื่องหมาย '~' บอกว่านี่คือ Destructor นะจ๊ะ การตั้งชื่อก็เหมือนกับชื่อ class ครับ ต่อไปก็เป็นฟังค์ชั่นภายใน class สำหรับ virtual จะอธิบายต่อไปครับ เรามาดูว่าการทำงานอัตโนมัติ มันทำงานอย่างไร |
| int main( ){ . . . .CData MyData; //<------- กำหนดตัวแปร class ชื่อ MyData }; |
| . . . . . .เมื่อเรากำหนดตัวแปร class แบบนี้ปั๊บ !! โปรแกรมจะทำงานส่วนของ Constructor ก่อนปุ๊บ !! และทำงานไปได้ แป๊บ !! พอจบการทำงาน มันก็จะทำงานส่วนของ Destructor ทันที โป๊บ !! เห็มมะพอดี เป๊ะ !! เลย ฮ่า ฮ่า ฮ่า คราวนี้เราจะมาเขียนการทำงานใน Constructor และ Destructor กัน |
| CData::CData( ) //<--------- นี่คือ Constructor เขียนแบบนี้{ . . . . . .strcpy( data, "Constructor" ); . . . . . .ShowData( ); } CData::~CData( ) //<--------- นี่คือ Destructor เขียนแบบนี้ { . . . . . .strcpy( data, "Destructor" ); . . . . . .ShowData( ); } |
| . . . . . .การทำงานครั้งแรกเมื่อกำหนดตัวแปร class เราให้ข้อความ "Constructor" แก่ตัวแปร data ที่อยู่ภายใน class และเรียกฟังค์ชั่นที่อยู่ภายใน class ชื่อ ShowData พิมพ์ข้อมูลที่อยู่ใน data ออกมา หลังจากจบการทำงานแล้ว จะไปทำงานส่วนของ Destructor ทันที โดย เราให้ข้อความ "Destructor" แก่ตัวแปร data ที่อยู่ภายใน class และเรียกฟังค์ชั่นที่อยู่ภายใน class ชื่อ ShowData พิมพ์ข้อมูลที่อยู่ใน data ออกมาอีกครั้งหนึ่ง การทำงานในส่วนของ ฟังค์ชั่น ShowData เป็นแบบนี้ และฟังค์ส่วนที่เหลือ ซึ่งเขียนเหมือนเดิมทุกประการเพียงแต่ต้องบอกว่าเป็นของ class อะไร ซึ่งมีรูปแบบ รูปแบบฟังค์ชั่น ชื่อคลาส :: ชื่อฟังค์ชั่น |
| void CData::ShowData( ) //<--------- นี่คือการเขียนฟังค์ชั่นของ class เขียนแบบนี้{ . . . . . .print( "%s \n", data ); } void CData::SetData( char *dt ) { . . . . . .strcpy( data, dt); //<------ คัดลอกข้อความจากตัวแปร dt ที่ส่งเข้ามาไปยังตัวแปร data ของ class } void CData::GetData( char *dt ) { . . . . . .strcpy( dt, data ); //<------ คัดลอกข้อความจากตัวแปร data ของ class ไปยังตัวแปร dt } |
| . . . . . .เป็นงัย ง่ายดีมะ ต้องค่อยๆทำความเข้าใจนะครับ ว่าแต่ละขั้นตอนมันทำงาน อย่างไร โอกาสหน้าเราจะมาลุยเรื่อง การสืบทอด class และ virtual function ครับ สวัสดี |