บทที่ 11 การเขียนโปรแกรมแบบ OOP

37
ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP บทที่ 11 การเขียนโปรแกรมแบบ OOP วิวัฒนาการของเทคนิคการเขียนโปรแกรม เมื ่อมีการพัฒนาเครื ่องคอมพิวเตอรขึ ้นในชวงประมาณป 1950 โปรแกรมเมอรในยุคแรกสุดใช วิธีการเขียนโปรแกรมโดยการโยกสวิตชไฟฟาที่มีอยูจํ านวนมากที่แผงวงจรไฟฟา เพื่อสลับไปมา ระหวางการปดและการเปด เพื ่อใหเกิดรหัสคํ าสั่ง 0 และ 1 โปรแกรมเมอรตองใชเวลา ความรอบคอบ และความอดทนเปนอยางยิ่ง ตอมาไดมีการคิดคนพัฒนาวิธีการเขียนโปรแกรมใหสะดวกและรวดเร็วขึ ้น จึงทํ าใหเกิดภาษาระดับตํ่ าขึ้น คือ ภาษาแอสเซมบลี้ (Assembly) และในเวลาตอมาก็เกิดภาษาระดับสูง ภาษาแรกขึ้นคือ ฟอรแทน (Fortran) ภาษาระดับสูง หมายถึงภาษาที่มีการกํ าหนดชนิดขอมูล มีการควบคุมลํ าดับการทํ างานอยางเปน ระบบ เขียนรหัสดวยภาษาอังกฤษ มีการใชคํ าและรูปแบบคํ าสั่ง ที่ใกลเคียงกับภาษาที่ใชในการสื่อสาร ทั่วไป ภาษาระดับสูงจึงทํ าใหงานเขียนโปรแกรมของโปรแกรมเมอรงายขึ ้น คนทั่วไปก็สามารถศึกษา วิธีการเขียนโปรแกรมนี ้ได ปญหาที่เกิดขึ้นในสมัยนั้นคือ การเขียนโปรแกรมที่มีความซับซอนและมีความยาวมาก ภาษา คอมพิวเตอรที ่มีอยู เมื ่อนํ ามาเขียนโปรแกรมทํ าใหเกิดความสับสนและวกวน (spaghetti code) ซึ่งมีผล ทํ าใหการติดตามแกไขและปรับปรุงโปรแกรมยุ งยาก ใชเวลามากเกินไป เชน การเขียนโปรแกรมดวย ภาษา BASIC เปนตน จึงทํ าใหมีการคิดคนวิธีการแกปญหาดังกลาว ดวยเหตุนี ้จึงทํ าใหเกิดภาษา คอมพิวเตอรที ่ใชเทคนิคการเขียนที ่เรียกวา Structured Programming โดยวิธีการนี ผูเขียนจะสนใจวา โปรแกรมทํ างานอะไรมากกวาการที่จะสนใจวาโปรแกรมนั้นทํ างานอยางไร หมายถึงวาตองคํ านึงถึง กอนวาในโปรแกรมมีการทํ างานตางๆ อะไรบาง มีการจัดแบงการทํ างานของโปรแกรมเปนสวน ตาม ประเภทของงาน จึงทํ าใหผูเขียนโปรแกรมสามารถแบงงานกันทํ สามารถนํ างานยอย ที่มีอยูแลวไป ใชในโปรแกรมอื ่น อีกโดยไมตองสรางใหม เชน การเขียนโปรแกรมดวยภาษาระดับสูงตาง ไดแก PASCAL, COBOL, TURBO, BASIC Cเปนตน ในปจจุบัน ถึงแมวาวิธีการของ Structure Programming จะเพิ่มประสิทธิภาพของการเขียน โปรแกรมไดดีขึ ้น แตตลอดเวลาที ่ผานมามีการพัฒนาขีดความสามารถของฮารดแวรคอมพิวเตอรอยาง ไมมีขอจํ ากัด จึงทํ าใหการเขียนโปรแกรมหรือซอฟตแวรตองมีการพัฒนาควบคู ไปดวย ลักษณะของ โปรแกรมสมัยปจจุบัน มีขนาดยาวมาก เปนลาน บรรทัด มีความซับซอนยุงยาก ตองใชทีมงานนัก โปรแกรมเมอรในการพัฒนาซอฟตแวรเปนจํ านวนมาก จึงทํ าใหมีการคิดคนวิธีการเขียนโปรแกรมแบบ ใหม ที่มีประสิทธิภาพยิ่งขึ้น เหมาะกับการพัฒนาซอฟตแวรขนาดใหญ วิธีดังกลาวไดแก วิธีที่เรียกวา

Transcript of บทที่ 11 การเขียนโปรแกรมแบบ OOP

Page 1: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

บทที่ 11การเขียนโปรแกรมแบบ OOP

♦ ! วิวัฒนาการของเทคนิคการเขียนโปรแกรมเม่ือมีการพัฒนาเคร่ืองคอมพิวเตอรข้ึนในชวงประมาณป 1950 โปรแกรมเมอรในยุคแรกสุดใช

วิธีการเขียนโปรแกรมโดยการโยกสวิตชไฟฟาที่มีอยูจ ํานวนมากที่แผงวงจรไฟฟา เพื่อสลับไปมาระหวางการปดและการเปด เพ่ือใหเกิดรหัสคํ าสั่ง 0 และ 1 โปรแกรมเมอรตองใชเวลา ความรอบคอบและความอดทนเปนอยางยิ่ง ตอมาไดมีการคิดคนพฒันาวิธีการเขียนโปรแกรมใหสะดวกและรวดเร็วข้ึนจึงท ําใหเกิดภาษาระดับตํ ่าขึ้น คือ ภาษาแอสเซมบลี้ (Assembly) และในเวลาตอมาก็เกิดภาษาระดับสูงภาษาแรกขึ้นคือ ฟอรแทน (Fortran)

ภาษาระดับสูง หมายถึงภาษาที่มีการก ําหนดชนิดขอมูล มีการควบคุมล ําดับการท ํางานอยางเปนระบบ เขียนรหัสดวยภาษาอังกฤษ มีการใชค ําและรูปแบบค ําสั่ง ที่ใกลเคียงกับภาษาที่ใชในการสื่อสารทั่วไป ภาษาระดับสูงจึงท ําใหงานเขียนโปรแกรมของโปรแกรมเมอรงายข้ึน คนทั่วไปก็สามารถศึกษาวิธีการเขียนโปรแกรมน้ีได

ปญหาที่เกิดขึ้นในสมัยนั้นคือ การเขียนโปรแกรมที่มีความซับซอนและมีความยาวมาก ภาษาคอมพิวเตอรท่ีมีอยูเม่ือนํ ามาเขียนโปรแกรมทํ าใหเกิดความสับสนและวกวน (spaghetti code) ซึ่งมีผลท ําใหการติดตามแกไขและปรับปรุงโปรแกรมยุงยาก ใชเวลามากเกินไป เชน การเขียนโปรแกรมดวยภาษา BASIC เปนตน จึงท ําใหมีการคิดคนวิธีการแกปญหาดังกลาว ดวยเหตุน้ีจึงทํ าใหเกิดภาษาคอมพิวเตอรท่ีใชเทคนิคการเขียนท่ีเรียกวา Structured Programming โดยวิธีการน้ี ผูเขียนจะสนใจวาโปรแกรมทํ างานอะไรมากกวาการที่จะสนใจวาโปรแกรมนั้นท ํางานอยางไร หมายถึงวาตองค ํานึงถึงกอนวาในโปรแกรมมีการทํ างานตางๆ อะไรบาง มีการจัดแบงการท ํางานของโปรแกรมเปนสวน ๆ ตามประเภทของงาน จึงท ําใหผูเขียนโปรแกรมสามารถแบงงานกันท ํา สามารถนํ างานยอย ๆ ที่มีอยูแลวไปใชในโปรแกรมอ่ืน ๆ อีกโดยไมตองสรางใหม เชน การเขียนโปรแกรมดวยภาษาระดับสูงตาง ๆ ไดแกPASCAL, COBOL, TURBO, BASIC Cเปนตน

ในปจจุบัน ถึงแมวาวิธีการของ Structure Programming จะเพิ่มประสิทธิภาพของการเขียนโปรแกรมไดดีข้ึน แตตลอดเวลาท่ีผานมามีการพัฒนาขีดความสามารถของฮารดแวรคอมพิวเตอรอยางไมมีขอจํ ากัด จึงท ําใหการเขียนโปรแกรมหรือซอฟตแวรตองมีการพฒันาควบคูไปดวย ลักษณะของโปรแกรมสมัยปจจุบัน มีขนาดยาวมาก เปนลาน ๆ บรรทัด มีความซับซอนยุงยาก ตองใชทีมงานนักโปรแกรมเมอรในการพฒันาซอฟตแวรเปนจํ านวนมาก จึงท ําใหมีการคิดคนวิธีการเขียนโปรแกรมแบบใหม ที่มีประสิทธิภาพยิ่งขึ้น เหมาะกับการพัฒนาซอฟตแวรขนาดใหญ วิธีดังกลาวไดแก วิธีที่เรียกวา

Page 2: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

143

การโปรแกรมแบบกํ าหนดวัตถุเปาหมาย หรือโอโอพี OOP (Object Oriented Programming) ซึ่งผูเชี่ยวชาญทางดานโปรแกรมกลาววา โปรแกรมท่ีมีขนาดต้ังแต 100,000 บรรทัดข้ึนไป วิธีการของ OOP จะชวยลดความซํ ้าซอนของโปรแกรมไดอยางมีประสิทธิภาพ

♦ !ความหมายของ OOPOOP (Object Oriented Programming) เปนวิธีการเขียนโปรแกรมซึง่จัดดํ าเนินการกับกลุม

ของ ออบเจ็กต (Object) ท่ีมีอยูในโปรแกรมออบเจ็กต เปนชนิดของขอมูลซึ่งประกอบไปดวยกลุมของ ขอมูล(data) และกลุมของ

ฟงกชัน(Function) โดยการใชขอมูลและฟงกชันเหลานี ้ แตละออบเจ็กตจะทํ างาน 1 งานไดสมบูรณ(ทั้งนี้เนื่องจากตัวออบเจ็กตเองประกอบไปดวยขอมูลและฟงกชัน)

ออบเจ็กต เปนสมาชิกของ ตัวแปรคลาส (class variable) มีลักษณะเปนโมดูล (modularity) ซึ่งประกอบไปดวย ตัวแปร ชนิดตาง ๆ ที่สัมพันธกัน และประกอบดวย ฟงกชัน ตาง ๆ โดยที ่ คลาส(class) จะหอหุมขอมูลและฟงกชันรวมไวดวยกันมีลักษณะที่เรียกวา encapsulation ดังน้ันจึงมีความสะดวกในการใชงาน สามารถปองกันสวนอื่น ๆ ของโปรแกรมไมใหเขาถึงตัวแปรชนิดโลคอลภายในคลาสไดอยางดีเยี่ยม

ดังน้ัน การเขียนโปรแกรมแบบ OOP คือ การสรางและ/หรือการเรียกใชออบเจ็กตใหทํ างานตามท่ีเราตองการ ในการเรียกใชออบเจ็กตน้ัน เราจะสนใจเฉพาะการท ํางานของออบเจ็กต็เทาน้ัน ไมจํ าเปนตองสนใจรายละเอียดภายในของออบเจ็กตวาเปนอยางไร

การใชออบเจ็กตของโปรแกรมจะมีลักษณะคลายกับการใชสิ่งของในชีวิตประจ ําวันของเรา เชนการใชโทรทัศน เราสามารถใชไดโดยไมจ ําเปนตองรูวาภายในเคร่ืองโทรทัศนมี "สวนประกอบ" อะไรบาง และไมจํ าเปนตองรูวาแตละสวนประกอบทํ างานอยางไร เราจะรูเพียงแควิธีใช เชน วิธีเปด วิธีเปลี่ยนชอง วิธีปรับเสียง วิธีปรับส ี วิธีตั้งเวลา วิธีปดเคร่ือง เปนตน ลักษณะของโปรแกรมแบบ OOPก็มีลักษณะคลายกบัการใชโทรทัศนในชีวิตประจํ าวัน ซึ่งจะไดศึกษาถึงวิธีการสรางและวิธีการใช OOPตอไป

♦ !คุณสมบัติของ OOPลักษณะของ OOP มีคุณสมบัติส ําคัญ 3 ประการ ดังน้ี1. มีการรวมขอมูลเขากับฟงกชัน (encapsulation) เพ่ือใหเปนขอมูลชนิดออบเจ็กต โดย

ออบเจ็กตหน่ึงจะมีคุณสมบัติเหมือนส่ิงของอยางหน่ึง คือมีทั้ง "สวนประกอบ" และ "การทํ างาน" ซึ่งสามารถใชงานไดทันท ี จะไดกลาวถึงรายละเอียดในหัวขอตอไป

Page 3: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

144

2. มีการสืบทอด (inheritance) เปนคุณสมบัติตาง ๆ ของออบเจ็กตหน่ึงซ่ึงเปน บรรพบุรุษหรือตนตอ เรียกวา แอนเซสเตอร (ancestor) และไดสืบทอดคุณสมบัติตาง ๆ ที่มีอยูใหกับออบเจ็กตท่ีเปน ลูกหลานหรือผูสืบทอด เรียกวา ดีเซนแด็นต (descendant) ไดหลายออบเจ็กต ท ําใหเกิดความสัมพันธเกี่ยวโยงเปนล ําดับชั้น จะไดกลาวถึงรายละเอียดในหัวขอตอไป

3. มีหลายรูปแบบ (polymorphism) คือคุณสมบัติท่ีเม่ือออบเจ็กตตางๆ ไดรับคํ าสั่งเดียวกันจากโปรแกรมแลว แตละออบเจ็กตจะทํ างานตามแบบของตัวเอง ซึ่งท ําใหไดผลลัพธแตกตางกัน คุณสมบัตินี้จะกลาวในหัวขอตอ ๆ ไป

♦ !ความหมายของออปเจ็กต (Object)Object หมายถึง ส่ิงของหรือวัตถุเปาหมาย การเขียนโปรแกรมแบบ OOP น้ัน หมายถึง กลุมขอ

มูล(data) และกลุมหนาที่การท ํางาน (function) ท่ีถูกรวมเปนหน่ึงหนวย เราเรียกวา Objectสามารถสรุปไดวา Object เปนการนํ าเอาขอมูลและฟงกชันรวมไวดวยกัน ดังภาพ

หรือแสดงลักษณะของ Object และสวนประกอบคือ กลุมของฟงกชันและขอมูล ไดดังภาพ

ลักษณะของออปเจ็กตดังกลาว เปนลักษณะของการรวมเอาขอมูลและฟงกชันไวในหนวยเดียวกัน เรียกวา เอนทิตี (Entity) เด่ียว ๆ ซึ่งเปนแนวคิดส ําคัญของการเขียนโปรแกรมแบบ OOP

การสรางออปเจ็กตตองสรางจากขอมูลชนิดที่เรียกวา คลาส (class) ดังจะไดศึกษาในหัวขอตอไป

! Code ของFunction

!! Data

!

! Object

! Object ! Function

! Function

! Function

Data

Data

Data

Page 4: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

145

♦ !วิธีสรางคลาส (class) ตนกํ าเนิดของออปเจ็กตออบเจ็กต (object) ตองสรางขึ้นจากขอมูลชนิด คลาส (class) รูปแบบของขอมูลชนิดคลาส มี

ลักษณะโครงสราง ดังน้ีคลาส

รูปแบบของการสรางขอมูลชนิด คลาส (class) เปนดังน้ี

class ช่ือคลาส{

private: หรือ public: หรือ protected:ดาตาเมมเบอร;ดาตาเมมเบอร;ดาตาเมมเบอร;private: หรือ public: หรือ protected:เมมเบอรฟงกชัน;เมมเบอรฟงกชัน;เมมเบอรฟงกชัน;

};

! ขอมูล

ฟงกชัน

! data1! data2! data3

! function1()! function2()! function3()

Page 5: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

146

คลาส (class) เปนขอมูลแบบสตรักเจอร(strucuture) ซึ่งประกอบไปดวยสมาชิกที่เรียกวาคลาสเมมเบอร (class member) หรือสมาชิกของคลาส ซึ่งมีสมาชิกอยู 2 ประเภท คือ

1. ดาตาเมมเบอร(data member) หรือ กลุมขอมูลที่เปนสมาชิกของคลาส ซ่ึงอาจเรียกอยางอ่ืนได เชน member variable, data item เปนตน

2. เมมเบอรฟงกชัน (member functions) หรือกลุมของฟงกชันที่เปนสมาชิกของคลาส อาจเรียกช่ือเปนอยางอ่ืนได เชน Method, Behavior

จากรูปแบบสวนประกอบของคลาส มีความหมายดังนี้- class ชื่อคลาส คํ าวา class เปนคียเวิรด(keyword)ที่ตองพิมพไวเพื่อก ําหนดใหเปนขอมูล

ชนิด class เพ่ือ เร่ิมตนสรางแหลงกํ าเนิดของออปเจ็กต(object) ท่ีจะใชในโปรแกรม สวน ชื่อคลาสต้ังตามกฎเกณฑการต้ังช่ือของ C++ เพ่ือนํ าไวใชอางอิงใน การสรางออปเจ็กต ในโปรแกรมตอไปสวนรายละเอียดอ่ืน ๆ ของคลาสก ําหนดไวในเคร่ืองหมาย { ….. };

- private: หรือ public: หรือ protected: เปนคียเวิรด(keyword) ตองพิมพเพื่อก ําหนดคุณสมบัติของดาตาเมมเบอรและเมมเบอรฟงกชัน มีความหมายดังนี้

private: หมายถึง ช่ือของดาตาเมมเบอรและเมมเบอรฟงกชันน้ัน จะเรียกใชไดเฉพาะภายในคลาสนี้เทานั้น

public: หมายถึง ช่ือของดาตาเมมเบอรและเมมเบอรฟงกชันน้ัน จะเรียกใชไดภายในคลาสนี้และจากภายนอกคลาสได

protected: หมายถึง ช่ือของดาตาเมมเบอรและเมมเบอรฟงกชันน้ัน จะเรียกใชไดเฉพาะภายในคลาส และใน คลาสที่สืบทอดตอ ๆ กันไป เทาน้ัน

• ! ตัวอยางการสรางคลาสชื่อ Date อยางงาย ๆ มีดังตอไปนี้class Date //class name

{private: // use only in this class

int Year; //ดาตาเมมเบอรint Month; //ดาตาเมมเบอรint Day; //ดาตาเมมเบอร

public: //use internal and external from another classvoid SetDate(int Y, int M, int D); //เมมเบอรฟงกชันvoid Display(); //เมมเบอรฟงกชัน

};

Page 6: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

147

จากตัวอยางการก ําหนดคลาสนี้ ชื่อคลาสคือ Date ประกอบไปดวยดาตาเมมเบอรท่ีเรียกใชไดเฉพาะในคลาสนี้เทานั้น 3 ตัว คือ Year, Month, Day และในคลาสประกอบไปดวยฟงกชันเมมเบอร ที่สามารถเรียกใชไดทั้งภายในและภายนอกของคลาส (เพราะกํ าหนดไวดวยค ําวา public) อีก 2ฟงกชัน คือ SetDate() และ Display() ซึ่งรายละเอียดการเขียน code ของท้ัง 2 ฟงกชันจะไดศึกษาในตัวอยางตอไป

รูปแบบของการสราง เมมเบอรฟงกชัน มีวิธีการเขียนเหมือนกับฟงกชันปกติของ C++ ท่ีไมไดเปนสมาชิกของคลาส ดังท่ีไดศึกษามาแลว แตมีรูปแบบที่แตกตางกันบาง ดังนี้

รูปแบบท่ี 1 กํ าหนดรายละเอียดของเมมเบอรฟงกชันตอจากฟงกชัน main() จะตองเขียนชื่อคลาส ใชเครื่องหมายแบงแยกขอบเขต :: (scope resolution operator) ตามหลังชื่อคลาสเช่ือมกับช่ือเมมเบอรฟงกชัน เพื่อบอกวาเปนสมาชิกของคลาสนั้น เชน

class Date{

private: // use only in this classint Year; //ดาตาเมมเบอรint Month; //ดาตาเมมเบอรint Day; //ดาตาเมมเบอร

public: //use internal and external of this classvoid SetDate(int Y, int M, int D); //เมมเบอรฟงกชันvoid Display(); //เมมเบอรฟงกชัน

};void main(){

สเตตเมนตในโปรแกรม;สเตตเมนตในโปรแกรม;

}

สรางคลาสช่ือ Date กอนเพ่ือนํ าไปสราง Object

Page 7: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

148

void Date::SetDate(int Y, int M, int D); //เมมเบอรฟงกชันของคลาส Date{

สเตตเมนตในฟงกชัน;สเตตเมนตในฟงกชัน;

}

void Date:: Display() //เมมเบอรฟงกชันของคลาส Date{

สเตตเมนตในฟงกชัน;สเตตเมนตในฟงกชัน;

}

รูปแบบท่ี 2 กํ าหนดรายละเอียดของเมมเบอรฟงกชันกอนฟงกชัน main และอยูภายนอกคลาสจะตองเขียนชื่อคลาสใชเครื่องหมายแบงแยกขอบเขต :: (scope resolution operator) ตามหลังชื่อคลาสเช่ือมกับช่ือเมมเบอรฟงกชัน เพื่อบอกวาเปนสมาชิกของคลาสนั้น

class Date{

private: // use only in this classint Year; //ดาตาเมมเบอรint Month; //ดาตาเมมเบอรint Day; //ดาตาเมมเบอร

public: //use internal and external of this classvoid SetDate(int Y, int M, int D); //เมมเบอรฟงกชันvoid Display(); //เมมเบอรฟงกชัน

};void Date::SetDate(int Y, int M, int D); //เมมเบอรฟงกชันของคลาส Date{

สเตตเมนตในฟงกชัน;สเตตเมนตในฟงกชัน;

}

สราง member function ชื่อ SetDateเปนสมาชิกของคลาส Date โดยกํ าหนดดวยเคร่ืองหมาย ::

สราง member function ชื่อ Display()เปนสมาชิกของคลาส Date โดยกํ าหนดดวยเคร่ืองหมาย ::

สราง member function ชื่อ SetDate()เปนสมาชิกของคลาส Date โดยกํ าหนดดวยเคร่ืองหมาย ::

Page 8: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

149

void Date:: Display() //เมมเบอรฟงกชันของคลาส Date{

สเตตเมนตในฟงกชัน;สเตตเมนตในฟงกชัน;

}

void main(){

สเตตเมนตในโปรแกรม;สเตตเมนตในโปรแกรม;

}

รูปแบบท่ี 3 กํ าหนดรายละเอียดของเมมเบอรฟงกชันอยูภายในคลาส ไมตองเขียนชื่อคลาส และไมตองเขียนเครื่องหมายแบงแยกขอบเขต :: (scope resolution operator) นํ าหนาชื่อเมมเบอรฟงกชัน เหมาะส ําหรับโปรแกรมท่ีมีเมมเบอรฟงกชันจํ านวนไมมาก และมีรายละเอียดของฟงกชันสั้น ๆ มีรูปแบบดังน้ี

class Date{

private: // use only in this classint Year; //ดาตาเมมเบอรint Month; //ดาตาเมมเบอรint Day; //ดาตาเมมเบอร

public: //use internal and external of this classvoid SetDate(int Y, int M, int D); //เมมเบอรฟงกชันของคลาส Date{สเตตเมนตในฟงกชัน;

}void Display() //เมมเบอรฟงกชันของคลาส Date{สเตตเมนตในฟงกชัน;

}};

สราง member function ชื่อ Display()เปนสมาชิกของคลาส Date โดยกํ าหนดดวยเคร่ืองหมาย ::

สราง member function ช่ือ SetDate()เปนสมาชิกของคลาส Date โดยสรางไว

ในคลาส

สราง member function ช่ือ Display()เปนสมาชิกของคลาส Date โดยสรางไว

ในคลาส

Page 9: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

150void main(){

สเตตเมนตในโปรแกรม;}

หมายเหตุ การสรางคลาสและรายละเอียดของเมมเบอรฟงกชัน อาจใชหลายรูปแบบรวมกันได

♦ ! การสรางและเรียกใชออบจ็กตจากคลาสกอนที่จะสรางออบเจ็กตใชในโปรแกรมไดจะตองสรางคลาสใหถูกตองกอนเพราะ คลาส(class)

เปนตนกํ าหนดของออบเจ็กต ซึ่งภายในคลาสจะตองก ําหนด ดาตาเมมเบอรและเมมเบอรฟงกชันไวและจะตองเขียน code ของเมมเบอรฟงกชันใหเสร็จสมบูรณกอน จึงจะสามารถน ําชื่อคลาสไปสรางออบเจ็กตและเรียกใชออกเจ็กตได

• ! ตัวอยางโปรแกรม clas_ex1.cpp เปนตัวอยางการสรางคลาส การสรางออบเจ็กตและการเรียกใชออบเจ็กตเบื้องตน โดยสรางเมมเบอรฟงกชันไวตอจากฟงกชัน main() ดังนี้

/*Program : clas_ex1.cpp Process : simple example of class*/ #include <iostream.h> #include <conio.h> class Date //create class Date { private: int Year; //data member int Month; //data member int Day; //data member public: void SetDate(int Y, int M, int D); //member function void Display(); //member function };

void main() //begin main program { Date birthday; //สรางออบเจ็กตชื่อ birthday จากคลาสชื่อ Date clrscr(); cout<<"Display First OOP Programming"<<endl; birthday.SetDate(2540,12,25); //เรียกใชออปเจ็กต birthday และฟงกชั่น SetDate() ท ํางาน birthday.Display(); //เรียกใชออปเจ็กต birthday และฟงกชัน display() ท ํางาน getch(); } //end main program

Page 10: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

151

void Date::SetDate(int Y, int M, int D) //detail of member function { Year = Y; Month = M; Day = D; } void Date::Display() //detail of member function { cout<<"Year : "<<Year<<endl; cout<<"Month: "<<Month<<endl; cout<<"Date : "<<Day<<endl; }

จากโปรแกรมตัวอยาง สรุปไดสวนสํ าคัญได ดังน้ี1. การสรางคลาสหรือกํ าหนดคลาสไมใชการสรางออบเจ็กต เปนเพียงแตแสดงใหทราบวา เม่ือ

มีการสรางออบเจ็กตแลว ออบเจ็กตที่ไดจะมีสวนประกอบเหมือนที่มีอยูในคลาส ซึง่ในโปรแกรมไดสรางออบเจ็กตข้ึน 1 ออบเจ็กตช่ือวา birthday จากประโยค Date birthday; แสดงวา birthday เปนออบเจ็กตท่ีมีสวนประกอบเหมือนท่ีมีอยูในคลาส Date

2. การเรียกใชเมมเบอรฟงกชันของออบเจ็กต ตองเขียนสเตตเมนตใหถกูตอง คือมีสวนประกอบ 3 สวนคือ ชื่อออบเจ็กต.ชื่อเมมเบอรฟงกชัน() พรอม argument ของฟงกชัน(ถามี) เชน

birthday.SetDate(2540,12,25);

birthday.Display();

เคร่ืองหมาย . มีช่ือเรียกวา คลาสเมมเบอรแอคเซสโอเปอเรเตอร (class member accessoperator) เปนโอเปอเรเตอรเพ่ือเรียกใชสมาชิกของคลาส

ออบเจ็กต ฟงกชัน

อารกิวเมนตของฟงกชัน

ออบเจ็กต ฟงกชัน

Page 11: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

152

• ! ตัวอยางโปรแกรม clas_ex2.cpp แสดงถึงการกํ าหนดใหดาตาเมมเบอรและเมมเบอรฟงกชันเปนลักษณะ public ดังนั้นการเรียกใชออบเจ็กต birthday ในฟงกชัน main() จึงสามารถเรียกใชดาตาเมมเบอรของ class ไดดวย จึงสามารถก ําหนดคาคงท่ีให Year,Month, Day ไดโดยตรง ดังรายละเอียดโปรแกรมตอไปนี้

/*Program : clas_ex2.cpp Process : using public member of class*/ #include <iostream.h> #include <conio.h>

class Date //create class Date { public: //use internal and external class int Year; //data member int Month; //data member int Day; //data member void SetDate(int Y, int M, int D); //member function void Display(); //member function };

void main() //begin main program { Date birthday; //create object name …birthday clrscr(); //set value to data member of class from object birthday.Year=2540; birthday.Month=12; birthday.Day = 25; cout<<"Display Second OOP Programming"<<endl; birthday.Display(); getch(); } //end main program

void Date::SetDate(int Y, int M, int D) //detail of member function { Year = Y; Month = M; Day = D; }

void Date::Display() //detail of member function { cout<<"Year : "<<Year<<endl; cout<<"Month: "<<Month<<endl; cout<<"Date : "<<Day<<endl; }

Page 12: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

153

• ! โปรแกรม oop_exam.cpp แสดงการสรางคลาสที่ชื่อวา VarClass ภายในคลาสประกอบไปดวย ดาตาเมมเบอร CharVar, IntVar, FloatVar และมีเมมเบอรฟงกชันชื่อ SetValueและ DisplayData โดยเขียนไวภายในคลาส จากนั้นไดสรางออบเจ็กตชื่อ Obj_numberดังตอไปนี้

/*Program : oop_exam.cpp Process : Create New Class and Object*/ #include <iostream.h> #include <conio.h>

class VarClass //Begin create class name is... VarClass { private: //data member char CharVar; int IntVar; float FloatVar; public: //member function void SetValue() //function in class { CharVar = 'A'; IntVar = 100; FloatVar= 3.14159; }

void DisplayData() //function in class { cout<<"Character : "<<CharVar<<endl; cout<<"Integer : "<<IntVar<<endl; cout<<"Float : "<<FloatVar<<endl; } }; //end of class void main() //begin main program { VarClass Obj_number; //create object name is Obj_number clrscr(); Obj_number.SetValue(); Obj_number.DisplayData(); getch(); } // end main program

Page 13: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

154

• ! ตัวอยางโปรแกรม oop_exa2.cpp มีผลการทํ างานเหมือนโปรแกรม oop_exam.cpp แตเขียนเมมเบอรฟงกชันไวนอกคลาส และสรางไวหลังฟงกชัน main() มีรูปแบบดังน้ี

/*Program : oop_exam.cpp Process : Create New Class and Object*/ #include <iostream.h> #include <conio.h> class VarClass //Begin create class name is... VarClass { private: //data member char CharVar; int IntVar; float FloatVar; public: void SetValue(); //member function void DisplayData(); //member function }; //end of class

void main() //begin main program { VarClass Obj_number; //create object clrscr(); Obj_number.SetValue(); //call object and function Obj_number.DisplayData(); //call object and function getch(); }

void VarClass::SetValue() //function in class { CharVar = 'A'; IntVar = 100; FloatVar= 3.14159; }

void VarClass::DisplayData() //function in class { cout<<"Character : "<<CharVar<<endl; cout<<"Integer : "<<IntVar<<endl; cout<<"Float : "<<FloatVar<<endl; }

Page 14: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

155

• ! ตัวอยางโปรแกรม clas_ex3.cpp มีการสรางเมมเบอรฟงกชนั GetDate() เพิ่มในโปรแกรมเพ่ือทํ าหนาท่ีรับคาคงท่ีทางคียบอรด และสรางออบเจ็กตชื่อ Dday เพิ่มขึ้นอีกหนึ่งออบเจ็กต ดังนี้

/*Program : clas_ex3.cpp Process : using public member of class */ #include <iostream.h> #include <conio.h>

class Date //create class Date { public: //use internal and external class int Year; //data member int Month; //data member int Day; //data member void GetDate(); //member function ...enter date void SetDate(int Y, int M, int D); //member function...send argumen void Display(); //member function...display date };

void main() //begin main program { Date birthday,Dday; //create 2 objects from Date class are birthday and Dday clrscr(); //set value to data member of class birthday.GetDate(); cout<<"Display Date enter from keyboard by object :birthday"<<endl; birthday.Display(); getch();clrscr(); cout<<endl<<"Display Date from argument by object : Dday"<<endl; Dday.SetDate(2530,11,29); Dday.Display(); getch(); } //end main program

void Date::GetDate() //detail of member function GetDate() { cout<<"Enter new Year<yyyy>: ";cin>>Year; cout<<"Enter new Month<mm>: ";cin>>Month; cout<<"Enter new Day<dd>: ";cin>>Day; }

Page 15: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

156

void Date::SetDate(int Y, int M, int D) //detail of member function SetDate() { Year = Y; Month = M; Day = D; }

void Date::Display() //detail of member function display() { cout<<"Year : "<<Year<<endl; cout<<"Month: "<<Month<<endl; cout<<"Date : "<<Day<<endl; }

• ! โปรแกรม oop_ex1.cpp แสดงการสรางคลาสชือ่ Calculate กํ าหนดใหมีสมาชิกเปน datamember ลักษณะ private จ ํานวน 2 ตัว คือ first และ second กํ าหนดใหมี memberfunction จ ํานวน 4 ฟงกชัน คือ sum(), subtract(), multiply(), divide() เพ่ือทํ าหนาท่ีในการคํ านวณการบวก,ลบ,คูณและหาร ของเลข 2 จ ํานวนตามล ําดับ ในโปรแกรมมีการสรางobject จ ํานวน 1 objcect ชื่อ math แลวนํ าออบเจ็กตน้ีมาเรียกใชในโปรแกรม ดังตอไปนี้

/*Program : oop_exp1.cpp Process : calculate */ #include <iostream.h> #include <conio.h>

class Calculate //create class { private: float first; float second; public: float sum(float x, float y); float subtract(float a, float b); float multiply(float a, float b); float divide(float a, float b); };

//declaration prototype void input(); //Not member function //declar global variable float number1,number2; Calculate math; //create object ....math from Calculate class

Page 16: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

157

void main() //begin main program { input(); cout<<"\nResult of sum = "<<math.sum(number1,number2); cout<<"\nResult of subtract = "<<math.subtract(number1,number2); cout<<"\nResult of multiply = "<<math.multiply(number1,number2); cout<<"\nResult of devide = "<<math.divide(number1,number2); getch(); } //end main program

void input() // Normal function enter 2 number , non member of class { clrscr(); cout<< "input first number : ";cin>>number1; cout<< "input first number : ";cin>>number2; } //member function sum() of class Calculate

float Calculate::sum(float first, float second) { return first+second; }

//member function subtract() of class Calculate float Calculate::subtract(float first, float second) { return first-second; }

//member function multiply() of class Calculate float Calculate::multiply(float first, float second) { return first*second; } //member function divide() of class Calculate float Calculate::divide(float first, float second) { return first/second; }

Page 17: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

158

• ! ตัวอยางโปรแกรม oop_ex2.cpp แสดงการคํ านวณการตดัเกรด โดยการสรางคลาสชื่อGrade และสรางออบเจ็กตชื่อ Evalue มีกระบวนการทํ างานของ member function อยู 3ฟงกชัน คือ GetScore() ทํ าหนาท่ีรับคะแนนระหวางภาคและปลายภาค รวมคะแนน,Calculate() ทํ าหนาท่ีน ําคะแนนรวมไปค ํานวณตัดเกรด และ Display() ทํ าหนาท่ีแสดงผลคะแนนรวมและเกรดท่ีไดรับ ดังรายละเอียดในโปรแกรมตอไปนี้

/*Program: grade2.cpp Process: calculate grade from total score by OOP Programming*/#include <iostream.h>#include <conio.h>class Grade //create class ...Grade { private: float midterm; //data member float final; float total; char gd; public: void GetScore(); //member function void Calculate(); void Display(); };Grade Evalue; //Create object ....Evaluevoid main() //begin main program{ clrscr(); cout<< "Program Calculate Grade"<<endl; //use object and function of class Evalue.GetScore(); Evalue.Calculate(); Evalue.Display(); getch();}

void Grade::GetScore() //member function of Grade class{ cout<< "Enter midterm score: ";cin>>midterm; cout<< "Enter midterm score: ";cin>>final; total=midterm+final;}

Page 18: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

159

void Grade::Calculate() //member function of Grade class{ //calculate grade use if...else if.. if (total<0 || total>100) //check enter error score gd = '*'; else if (total>=0 && total<=49) gd='F'; else if(total>=50 && total<=59) gd='D'; else if(total>=60 && total<=69) gd='C'; else if(total>=70 && total<=79) gd='B'; else gd='A';}void Grade::Display() //member function of Grade class{ cout<< "Total of your score: \a"<<total<<endl; cout<< "You get grade : "<<gd<<endl; if (gd=='*') cout<< "Your score = "<<total<< " is error range !!!"<<endl;}

• ! ตัวอยางโปรแกรม exp_oop1.cpp แสดงการเขียนโปรแกรมแบบ OOP โดยมีเมมเบอรฟงกชัน 2 ฟงกชัน คือ input() และ display() โดยท่ีฟงกชัน input() ทํ าหนาท่ีรับขอมูลทางแปนพิมพ และฟงกชัน display() ทํ าหนาท่ีแสดงผลขอมูลท่ีกรอกทางแปนพิมพไว

/*Program: EXP_OOP1.CPP Process: Input,Display data function*/

#include <iostream.h>#include <conio.h>#include <stdio.h>class TEST //create class{ public: char name[30]; //data member char address[50]; int age; public: //member function void input(); void display();};

Page 19: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

160

TEST Info; //create object ...Info... from class

void main() //begin main program{ clrscr(); Info.input(); Info.display();}

void TEST::input() //Create member function of class TEST{ cout<<"Enter your information: "<<endl; cout<<"Name: "; gets(name); cout<<"Address: "; gets(address); cout<<"Age: "; cin>>age;}void TEST::display() //Create member function of class TEST{ clrscr(); cout<<"*********************"<<endl; cout<<"Your information... "<<endl; cout<<"*********************"<<endl; cout<<"Name: "<<name<<endl; cout<<"Address: "<<address<<endl; cout<<"Age: "<<age <<endl; cout<<"*********************\a\a"<<endl; getch();}

• ! ตัวอยางโปรแกรม Draw_cir.cpp เปนโปรแกรมสรางออบเจ็กต ชื่อ TheCircle จากคลาสCircle โดยกํ าหนดเมมเบอรฟงกชันเพื่อก ําหนดต ําแหนงวาดวงกลมโดยการกํ าหนดคาSetCircle() และรับคาตํ าแหนงของวงกลม InputCircle() พรอมแสดงผลการวาดวงกลมDisplay() ดังตอไปนี้

/*Program : Draw_cir.cpp Process : set position and draw circle graphics by OOP */#include <iostream.h>#include <stdlib.h>#include <graphics.h>

Page 20: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

161

#include <conio.h>class Circle { private: int X, Y, Radius; public: void SetCircle(int,int,int); void InputCircle(); void Display(); };

void main() { Circle TheCircle; //create object ....TheCircle clrscr(); /* request auto detection */ int gdriver = DETECT, gmode, errorcode; /* initialize graphics mode */ initgraph(&gdriver, &gmode, ""); TheCircle.SetCircle(300,200,200); //set X,Y and Radius TheCircle.Display(); //Display Circle TheCircle.SetCircle(300,200,100); //set X,Y and Radius TheCircle.Display(); //Display Circle getch();clrscr(); TheCircle.InputCircle(); //Enter X,Y and Radius TheCircle.Display(); //Display Circle getch(); closegraph; }

void Circle::SetCircle(int Xc, int Yc, int Rc){ X=Xc; Y=Yc; Radius=Rc;}

void Circle::Display(){ circle(X,Y,Radius);}

Page 21: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

162

void Circle::InputCircle(){ closegraph; cout<< "Enter data for circle:"<<endl; cout<< "Center point : X = ";cin>>X; cout<< "Center point : Y = ";cin>>Y; cout<< "Radius : ";cin>>Radius;}

♦ !ตัวอยางการเขียนโปรแกรมแบบ OOP จัดการ Array และ Structureเราสามารถจัดการขอมูลที่เปน array โดยสรางใหเปนขอมูลชนิด Object ได ดังตัวอยาง

โปรแกรมตอไปน้ีตัวอยางโปรแกรม OOP_ARR.CPP แสดงการใช array ที่เปน Object ชื่อ Object คือ result

[5] สรางจาก class ที่ชื่อ TEST โดยจอง array ไวทั้งหมด 5 ชอง มี member function ของ class คือinput(), summation(), display() โ ดยที่ฟงกชัน input() ท ําหนาที่รับขอมูลเขาไปเก็บใน data ที่ชื่อnumber1, number2 ฟงกชัน summation() ท ําหนาทีรวมจํ านวน number1+number2 เก็บไวใน sumและฟงกชัน display() ท ําหนาที่แสดงขอมูล array ใน data ที่ชื่อ number1, number2 ที่ไดกรอกไว 5จํ านวน

/*Program: OOP_ARR.CPP Process: Uses array of Object for Input,Summation,Display data function*/

#include <iostream.h>#include <conio.h>#include <stdio.h>

class TEST //create class{ public: //data members int number1; int number2; int sum; public: //member function void input(); void display(); void summation();};

Page 22: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

163

TEST result[5]; //Create Object ....is Array result[5]

void main(){ clrscr(); for(int i=0;i<=4;i++) { result[i].input(); } cout<<endl<<"Display number 1, number 2 in array"<<endl; for(i=0;i<=4;i++) { result[i].display(); }//Calculate Summation number1+number2 in array for(i=0;i<=4;i++) { result[i].summation(); } getch(); cout<<endl<<"Display Summation: "<<endl; for(i=0;i<=4;i++) { cout<<"Sum["<<i<<"]"<<result[i].sum<<endl; } getch();

} //end main program

void TEST::input() //Create member function of class TEST{ cout<<"Enter your number: "<<endl; cout<<"Number1: ";cin>>number1; cout<<"Number2: ";cin>>number2;}void TEST::display() //Create member function of class TEST{ cout<<"Your number : "<<endl; cout<<"Number1: "<<number1<<endl; cout<<"Number2: "<<number2<<endl<<endl;}

Page 23: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

164

void TEST::summation(){ sum=number1+number2;}

• ! ตัวอยางโปรแกรม OOP_STRU.CPP เปนตัวอยางโปรแกรมเขียนแบบ OOP เพื่อจัดการขอมูลท่ีเปนอารเรยของโครงสราง มีดังตอไปนี้

/*Program: OOP_STRU.CPP Process: Used OOP manage Array of Structure */

#include <iostream.h>#include <conio.h>#include <stdio.h> //for gets() function

struct PER //Create Structure Data Type ....Global { char code[5]; char name[30]; char position[20]; float salary; };

class EMP //Create Class for origin of Object { public: PER person[5]; //data member is ...array of PER public: void Input(); //member function void Display(); void Report(); };

EMP Employee; //Creat Object from class ...EMP

void main() { clrscr(); Employee.Input(); Employee.Display(); getch();clrscr();

Page 24: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

165

Employee.Report(); getch(); }

void EMP::Input() //Detail of member function{ int i; for(i=0;i<=4;i++) { cout<<"Code: ";gets(person[i].code); cout<<"Name: ";gets(person[i].name); cout<<"Position: ";gets(person[i].position); cout<<"Salary: ";cin>>person[i].salary; }}

void EMP::Display() //Detail of member function{ int i; clrscr();cout<<"Display Information"<<endl; for(i=0;i<=4;i++) { cout<<"Record#"<<i+1<<endl; cout<<person[i].code<<endl; cout<<person[i].name<<endl; cout<<person[i].position<<endl; cout<<person[i].salary<<endl; getch();clrscr(); }}

void EMP::Report() //Detail of member function{ int r=6,i; clrscr(); gotoxy(25,1);cout<<"Report Salary Expense"; gotoxy(25,2);cout<<"Sirichai Export Co.ltd"; gotoxy(1,3);cout<<"----------------------------------------------------"; gotoxy(1,4);cout<<"Code Name - Surname Position Salary"; gotoxy(1,5);cout<<"----------------------------------------------------"; for(i=0;i<=4;i++) { gotoxy(1,r);cout<<person[i].code; gotoxy(8,r);cout<<person[i].name; gotoxy(25,r);cout<<person[i].position; gotoxy(40,r);cout<<person[i].salary;

Page 25: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

166

r++; if(r>=22) { getch(); r=6; } }}

♦ !ฟงกชันชนิดคอนสตรักเตอรและดิสตรักเตอรจากตัวอยางที่ผานมาในการก ําหนดคาใหแกดาตาเมมเบอรของคลาสในขณะเรียกใช

ออปเจ็กตน้ัน เราจะก ําหนดคาคงที่ใหขณะที่มีการเรียกใช เชน Dday.SetDate(2530,11,29);หรือมีการรับคาทางคียบอรดเพ่ือกํ าหนดคาดาตาเมมเบอร

การก ําหนดคาใหแกดาตาเมมเบอรสามารถก ําหนดใหมีคาเร่ิมตนแบบอัตโนมัติได โดยการใชเมมเบอรฟงกชันชนิดท่ีเรียกวา คอนสตรักเตอร (constructor) ซึ่งจะเปนเมมเบอรฟงกชันที่ท ํางานโดยอั ต โนมั ติ ทั นที ที่ อ อบ เ จ็ ก ต ถู ก ส ร า ง ขึ้ น เ พ ร า ะฉ ะ น้ั น จ ะต อ ง กํ าหนดค า เ ร่ิ ม ต น ของ ดาตาเมมเบอรไวเปนคาเร่ิมตนดวย การสรางเมมเบอรฟงกชันชนิดคอนสตรักเตอร สรางไวใน classกํ าหนดช่ือใหเหมือนกับช่ือของ class และก ําหนดคาคงที่ใหแก ดาตาเมมเบอรภายในเคร่ืองหมาย{ } ดังรูปแบบตัวอยางในโปรแกรม cons_oop.cpp

• ! ตัวอยางโปรแกรม cons_oop.cpp แสดงการสราง constructor เพื่อกํ าหนดคาเร่ิมตนอัตโนมัติเมื่อมีการใชออปเจ็กต มีรายละเอียดดังนี้

/*Program : cons_oop.cpp Process : create constructor member function of class*/ #include <iostream.h> #include <conio.h> class Date //create class Date { private: int Year; //data member int Month; //data member int Day; //data member public: Date() //constructor member function…function name same as class name { Year = 1997; //คาคงที่ของ data member ที่เปนคาเริ่มตน Month=12; Day=31; }

Page 26: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

167

void SetDate(int Y, int M, int D); //member function void Display(); //member function };

void main() //begin main program { Date birthday; clrscr(); cout<<"Display Constructor member function : OOP Programming"<<endl; //use constructor cout<<endl<<"Display Date from constructor member function"<<endl; birthday.Display(); //set value of data member cout<<endl<<"Display Date from setting value"<<endl; birthday.SetDate(2540,10,22); birthday.Display(); getch(); } //end main program

void Date::SetDate(int Y, int M, int D) //detail of member function { Year = Y; Month = M; Day = D; }

void Date::Display() //detail of member function { cout<<"Year : "<<Year<<endl; cout<<"Month: "<<Month<<endl; cout<<"Date : "<<Day<<endl; }

Page 27: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

168

ผลการทํ างานของโปรแกรมDisplay Constructor member function : OOP Programming

Display Date from constructor member function //คาท่ีไดเกิดจากการใช constructorYear : 1997Month: 12Date : 31

Display Date from setting value //คาท่ีไดเกิดจากการกํ าหนดคาYear : 2540Month: 10Date : 22

เม่ือมีการสราง constructor ซึ่งจะท ําใหออบเจ็กตสามารถมีคาเร่ิมตนทํ างานไดโดยอัตโนมัติไดการยกเลิก constructor หรือยกเลิกการทํ างานของออบเจ็กตโดยอัตโนมัติ เพื่อยกเลิกการใชหนวยความจ ํา จะตองสรางเมมเบอรฟงกชันชนิดท่ีเรียกวา ดิสตรักเตอร (destructor) ซึ่งจะมีชื่อเดียวกับคอนสตรักเตอรเพียงแตมีเคร่ืองหมาย ~ กํ ากับที่หนาชื่อฟงกชันไมมีพารามิเตอรและไมมีรายละเอียดในเครื่องหมาย { } เชนclass Date //create class Date { private: int Year; //data member int Month; //data member int Day; //data member public: Date() //constructor member function…function name same as class name { Year = 1997; //คาคงที่ของ data member ที่เปนคาเริ่มตน Month=12; Day=31; }

~Date() { }; //สรางดิสตรักเตอร void SetDate(int Y, int M, int D); //member function void Display(); //member function };

หมายเหตุ ทั้งฟงกชันประเภท คอนสตรักเตอรและดิสตรักเตอร จะไมมีการสงคาออกจากฟงกชัน

Page 28: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

169

♦ !คุณสมบัติการสืบทอด (inheritance)การสืบทอด (inheritance) เปนคุณสมบัติส ําคัญของการเขียนโปรแกรมเชิงวัตถุเปาหมาย

(OOP) หมายถึง การถายทอดคุณสมบัติตาง ๆ ของออบเจ็กตท่ีเปนตนกํ าเนิดหรือบรรพบุรุษ ซ่ึงเราเรียกวา แอนเซสเตอร (ancestor) ไปยังออบเจ็กตที่เปนลูกหลานหรือผูสืบทอด เราเรียกวาดีเซนแด็นต (desendant) ไดหลายออบเจ็กต ท ําใหเกิดความสัมพันธระหวางคลาสและออบเจ็กตเปนลํ าดับชั้นเหมือนกับการล ําดับความสัมพันธของเครือญาติ

การถายทอดคุณสมบัติของคลาสจะเริ่มจากคลาสเริ่มตน ที่เรียกวา เบสคลาส (base class)หรือ แอนเซสเตอร (ancestor) ไปยังคลาสใหมที่สืบเนื่องจากคลาสเริ่มตน เรียกคลาสที่สืบเนื่องนี้วา ดีไรฟคลาส (derived class) หรือ ดีเซนแด็นต (desendant)

ดีไรฟคลาส (derived class) จะสืบทอดคุณสมบัติทั้งหมดของ ดาตาเมมเบอรและเมมเบอรฟงกชันที่มีอยูใน เบสคลาส (base class) ยกเวน คอนสตรักเตอรและดิสตรักเตอร

ลักษณะความสัมพันธระหวาง base class กับ derived class จะอยูในรูปแบบ 4 ลักษณะ ดังน้ี

1. หนึ่งดีไรฟคลาส สืบทอดคุณสมบัติจาก หนึ่งเบสคลาส ดังรูป

2. หลายดีไรฟคลาส สืบทอดคุณสมบัติจาก หนึ่งเบสคลาส ดังรูป

! เบสคลาส D

! ดีไรฟคลาส A

! เบสคลาส D

! ดีไรฟคลาส B! ดีไรฟคลาส A ! ดีไรฟคลาส C

Page 29: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

170

3. หนึ่งดีไรฟคลาส สืบทอดคุณสมบัติจาก หลายเบสคลาส ดังรูป

4. หลายดีไรฟคลาส สืบทอดคุณสมบัติตอเนื่องกันไปหลายล ําดับจาก หนึ่งเบสคลาส ดังรูป

รูปแบบการสราง ดีไรฟคลาส (derived class) จะมีรูปแบบและสวนประกอบตางๆ เหมือนกับการสราง เบสคลาส มีรูปแบบ ดังน้ี

class ช่ือดีไรฟคลาส : private หรอื public หรอื protected ช่ือเบสคลาส{

private หรือ public หรือ protected :ดาตาเมมเบอร;ดาตาเมมเบอร;ดาตาเมมเบอร;

private หรือ public หรือ protected :เมมเบอรฟงกชัน;เมมเบอรฟงกช่ัน;

};

! ดีไรฟคลาส D

! เบสคลาส B! เบสคลาส A ! เบสคลาส C

! เบสคลาส D

! ดีไรฟคลาส A

! ดีไรฟคลาส B

! ดีไรฟคลาส C

Page 30: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

171

ตัวอยางเชน การสรางเบสคลาส ชื่อ Draw และสรางดีไรฟคลาส ชื่อ Pointclass Draw //เบสคลาส

{protected:

int X, Y, Color;public:

Draw(int InitX, int InitY, int InitColor) //คอนสตรักเตอร { X = InitX; Y = InitY; Color = InitColor; }~Draw() //ดิสตรักเตอร {

closegraph(); }

};class Point : public Draw //ดีไรนคลาสชื่อ Point สืบทอดมาจากคลาส Draw

{public: //คอนสตรักเตอรฟงกชันชื่อ Point Point(int InitX, int InitY, Int InitColor) : Draw(InitX, InitY, InitColor)

{};void Display();void Hide();

};

การกํ าหนดเบสคลาสและดีไรฟคลาสจากตัวอยาง มีความหมายดังน้ี- Draw เปนเบสคลาส มีคลาส Point เปนดีไรฟคลาส แสดงวาคลาส Point จะสามารถสืบ

ทอดคุณสมบัติตาง ๆ มาจากคลาส Draw ได- class Point : public Draw เปนประโยคกํ าหนดใหคลาส Point เปนดีไรฟคลาสของคลาส

Draw คํ าวา public กํ าหนดอยูหนาชื่อเบสคลาส Draw หมายถึง ออบเจ็กตท่ีสรางโดยใชดีไรฟคลาสนั้น จะสามารถเรียกใชสมาชิก (ดาตาเมมเบอรและเมมเบอรฟงกชัน) ของเบสคลาสในสวนที่เปน public ไดทั้งหมด ตามตัวอยาง ถาสรางออบเจ็กตช่ือ Apoint จากดีไรฟคลาส Point

Point Apoint;แสดงวาออบเจ็ตก Apoint เปนออบเจ็กตที่สรางจากดีไรฟคลาสที่ชื่อ Point จะ

สามารถเรียกใชฟงกชันในคลาส Draw ไดทุกฟงกชัน- protected: ในคลาส Draw หมายถึง สมาชิกของคลาส (อาจเปนดาตาเมมเบอรหรือเมมเบอร

ฟงกชันก็ได) ที่อยูภายใตคํ าวา protected จะยอมใหดีไรฟคลาสของคลาสนี้เทานั้นที่สามารถเรียกใชได

Page 31: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

172

ในตัวอยางแสดงวา นอกจากการเรียกใชสมาชิกในคลาส Draw ไดแลว คลาส Point จะสามารถเรียกใชดาตาเมมเบอร X, Y และ Color ของคลาส Draw ไปใชไดดวย เนื่องจากคลาส Point เปนดีไรฟคลาสของ Draw น่ันเอง (เรียกวาลักษณะการสืบทอดคุณสมบัต)ิ

♦ !ตัวอยางการสืบทอดคุณสมบัติในโปรแกรมโปรแกรม INHER_EX.CPP แสดงการสืบทอดคุณสมบัติ (ฟงกชันและขอมูล) ของคลาสใน

รูปแบบ หนึ่งเบสคลาสสืบทอดคุณสมบัติไปสูหลายดีไรฟคลาส มีโครงสรางการสืบทอด ดังน้ี

จากโครงสรางการสืบทอดของเบสคลาส vehicle ไปสูดีไรฟคลาส คือ truck ,automobile ไดมีเรียกใช object ที่สรางจากคลาส truck และ automobile แตเรียกใชคุณสมบัติหรือสืบทอดคุณสมบัติที่เปน member function ของคลาส vehicle ซึ่งเปนเบสคลาส ในโปรแกรมดังน้ี

t1.set_wheels(18);t1.set_cargo(3200);t2.set_wheels(6);t2.set_pass(3);c.set_wheels(4);c.set_pass(6);

• ! ตัวอยางโปรแกรม INHER_EX.CPP เปนโปรแกรมแสดงการใชคุณสมบัติInheritance ของการเขียนโปรแกรมแบบ OOP

! vehicle! (base class)

! truck! (derived class1)! สราง object! t1,t2

! automobile! (derived class2)! สราง object! c

มี member function! set_wheels()! get_wheel()! set_pass()! get_pass()

! มี member function! set_cargo()! get_cargo()! show()

มี member function! set_type()! get_type()! show()

Page 32: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

173

/*Program : INHER_EX.CPP Process : show inheritance from base class to derived class class vehicle --> class turck, automobile*/ #include <iostream.h> #include <conio.h> class vehicle //base class { int wheels; int passengers; public: //declared public function in class void set_wheels(int num); int get_wheels(); void set_pass(int num); int get_pass(); };

class truck:public vehicle //derive class of class vehicle { int cargo; public: void set_cargo(int size); int get_cargo(); void show(); };

enum type_auto{car,van,wagon}; //set enumerated data type

class automobile:public vehicle //derive class of class vehicle { type_auto car_type; //enumerated variable public: void set_type(enum type_auto t); enum type_auto get_type(); void show(); };

void vehicle::set_wheels(int num) { wheels=num; }int vehicle::get_wheels(){ return wheels;}

Page 33: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

174

void vehicle::set_pass(int num) { passengers=num; }

int vehicle::get_pass() { return passengers; }

//begin created member function of truck class void truck::set_cargo(int num) { cargo=num; }int truck::get_cargo() { return cargo; } void truck::show() { cout<< "Wheels : "<<get_wheels()<<"\n"; cout<< "Passengers : "<<get_pass()<<"\n"; cout<< "Cargo capacity in cubic feet : "<<cargo<<"\n"; }

//begin created member function of automobile class void automobile::set_type(enum type_auto t) { car_type=t; }

type_auto automobile::get_type() { return car_type; }

void automobile::show() { cout<<"Wheels : "<<get_wheels()<<"\n"; cout<<"Passengers: "<<get_pass()<<"\n";

Page 34: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

175

cout<<"Type : "; switch(get_type()) { case van: cout<<"Van\n";break; case car: cout<<"Car\n";break; case wagon: cout<<"Wagon\n";break; } }

void main() //Begin main program { clrscr(); cout<<"Display Inheritance from Class vehicle to truck and automobile...."<<endl<<endl; truck t1,t2; //created object...t1 and t2 from class truck automobile c; //created object...c from class automobile //used object and called function member t1.set_wheels(18); //use inheritance set_wheels() from based class...vehicle t1.set_pass(2); //use inheritance set_pass() from based class...vehicle t1.set_cargo(3200); //use function set_cargo() from derived class...truck t2.set_wheels(6); //use inheritance set_wheels from based class...vehicle t2.set_pass(3); //use inheritance set_pass() from based class...vehicle t2.set_cargo(1200); //use function set_cargo() from derived class...truck t1.show(); //use function show() derived class...truck cout<<endl; t2.show(); //use function show() derived class...truck c.set_wheels(4); //use inheritance set_wheels() from base class...vehicle c.set_pass(6); //use inheritance set_pass() from base class...vehicle c.set_type(van); //use function set_type() from derived class...automobile cout<<endl; c.show(); //use function show() from derived class...automobile getch();}

ผลการ run โปรแกรม เปนดังน้ี

Display Inheritant from Class vehicle to truck and automobile....

Wheels : 18

Page 35: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

176

Passengers : 2Cargo capacity in cubic feet : 3200

Wheels : 6Passengers : 3Cargo capacity in cubic feet : 1200

Wheels : 4Passengers: 6Type : Van

• ! ตัวอยางโปรแกรม Dra_cir2.cpp แสดงการถายทอดคุณสมบัติ (inheritance) จากเบสคลาส Draw ไปสูดีไรฟคลาสที่ชื่อ Point

/*Program : Dra_cir2.cpp Process : display and hide point from derived class */#include <iostream.h>#include <stdlib.h>#include <graphics.h>#include <conio.h>

class Draw //base class { protected: //ใชไดเฉพาะในเบสคลาสและดีไรฟคลาส int X, Y, Color; public: Draw(int InitX, int InitY, int InitColor) //construture { X=InitX; Y=InitY; Color=InitColor; }

~Draw() //destructure function { closegraph(); //close graphic mode }

Page 36: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

177

};

class Point : public Draw //derived class { public: Point(int InitX,int InitY,int InitColor):Draw(InitX,InitY,InitColor){} void Display(); void Hide(); };

void main() { /* request auto detection graphic display hardware*/ int gdriver = DETECT, gmode, errorcode; /* initialize graphics mode */ initgraph(&gdriver, &gmode, ""); //create object from derived class and inheritance attribute Point Apoint(320,240,WHITE); //สรางออบเจ็กตชื่อ Apoint Apoint.Display(); //function for display white point on screen getch(); Apoint.Hide(); //function for display background color point on screen Apoint.Display(); getch(); }

void Point::Display(){ putpixel(X,Y,Color);}void Point::Hide(){ putpixel(X,Y,getbkcolor());}

♦ !แบบฝกหัดทายบท

Page 37: บทที่ 11 การเขียนโปรแกรมแบบ OOP

!

! ศิริชัย นามบุรี การเขียนโปรแกรมแบบ OOP

178

1. ใหนักศึกษาเขียนโปรแกรมแบบ OOP เพื่อคํ านวณคาและแสดงผลลัพธพื้นที่ของรูปเรขาคณิต โดยใหสรางเมมเบอรฟงกชันของคลาสเพื่อทํ าหนาที่คํ านวณคาของพื้นที่และแสดงผล ดังตอไปน้ี

- พื้นที่รูปสี่เหลี่ยม- พื้นที่รูปสามเหลี่ยม- พื้นที่วงกลม

2. ใหเขียนโปรแกรมเพ่ือจัดเก็บขอมูลประวัติพนักงานไมเกิน 100 คน มีรายละเอียดขอมูลไดแกรหัสพนักงาน, ชื่อพนักงาน และเงินเดือนโดยกํ าหนดใหม ีmember function ส ําคัญ ๆ ดังน้ี- Input() ท ําหนาท่ีรับขอมูล รหัสพนักงาน, ช่ือพนักงานและเงินเดือน- Cal_Net_Tax() ท ําหนาที่ค ํานวณภาษีหัก ณ ท่ีจายจากเงินเดือน 7% และค ํานวณเงินเดือนคงเหลือสุทธิ

- Cal_Total() ท ําหนาที่ค ํานวณเงินเดือนรวม, ภาษีรวม, เงินคงเหลือสุทธิรวมของพนักงานทุกคน

- Report() ท ําหนาที่แสดงรายงานที่มีรายละเอียดขอมูล รหัสพนักงาน, ชื่อพนักงาน, เงินเดือน,ภาษีหัก ณ ที่จาย, เงินเดือนเหลือสุทธิของพนักงานแตละคน และยอดสรุปรวมเงินเดือน,ภาษีหัก ณ ท่ีจายรวม และเงินเดือนสุทธิรวม

3. ใหเขียนโปรแกรมคํ านวณการตัดเกรดแบบอิงเกณฑ โดยใชวิธีการเขียนโปรแกรมแบบ OOPใหโปรแกรมมีความสามารถ ดังตอไปน้ี

- รับขอมูลรหัสนักศึกษา, ชื่อนักศึกษา, คะแนนระหวางภาค, คะแนนปลายภาค- คํ านวณการตัดเกรดตามเกณฑ คะแนนดังน้ี

0-49 เกรด F50-59 เกรด D60-69 เกรด C70-79 เกรด B80-100 เกรด A

- แสดงรายละเอียดที่กรอกทั้งหมด พรอมแสดงคะแนนรวมและเกรดท่ีได

ขอกํ าหนด ใหโปรแกรมสามารถเก็บขอมูลนักศึกษาพรอมกันไดไมเกิน 100 คน