###### tags: `c++_beginner` # Week 04 > 這周是類別和繼承,是我以前完全沒碰過的領域,一樣也是一起加油吧! 1. [structure](https://www.youtube.com/watch?v=9j5KkOC_goQ) <iframe width="560" height="315" src="https://www.youtube.com/embed/9j5KkOC_goQ?si=PNLAQx73wsRPJ3kB" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> 2. [Class+Inheritance](https://www.youtube.com/watch?v=wN0x9eZLix4&t=276s) <iframe width="560" height="315" src="https://www.youtube.com/embed/wN0x9eZLix4?si=8aJmx-d_W0sQsHFf" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> 3. [Operator Overloading](https://www.youtube.com/watch?v=BnMnozsSPmw) <iframe width="560" height="315" src="https://www.youtube.com/embed/BnMnozsSPmw?si=PadCHgcJVd5HRNNb" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> ## Structure ### 講解 就像C一樣,structure的概念就是創造自己的資料類別的感覺,而我們可以定義自己的資料類別裡有哪些變數。 宣告: ```cpp= struct Book{ int ID; string title; string author; int year; }; ``` 初始化: ```cpp= int main() { Book book01; book01.ID=1001; book01.title="Mrs Dalloway"; book01.author="Virginia Woolf"; book0.year=1925; return 0; } ``` ### 題目 1. [Structs](https://www.hackerrank.com/challenges/c-tutorial-struct/problem?isFullScreen=true) ## Class ### 講解 類似於struct的東西,但是,他可以擁有自己的函數,而且可以使用 Inheritance 和 Operator Overloading 來操作變數,使寫程式更便利。 **宣告:** ```cpp= class Person {// The class private:// Access specifier char Gender;// Attribute public: int Age; string Name; Person(int age,string name,char gender){//Constructors Age=age; Name=name; Gender=gender; } void Introduction() {//Class Methods cout << "Hello! My name is "<<Name<<endl; } }; ``` **使用:** ```cpp= int main(){ Person Jason=Person(17,"Jason",'b');//Call the constructors and set the attributes Jason.Introduction();//Call the class method: Introduction() cout<<Jason.Age<<endl;//There won't be any bug because this attribute is public cout<<Jason.Gender<<endl;//There will be a bug because this attribute is private } ``` #### Access specifier Access specifiers define how the members (attributes and methods) of a class can be accessed * public: members are accessible from outside the class * private: members cannot be accessed (or viewed) from outside the class * protected: members cannot be accessed from outside the class, however, they can be accessed in inherited classes. You will learn more about Inheritance later. #### Constructors A constructor in C++ is a special method that is automatically called when an object of a class is created. #### Class Methods Methods are functions that belongs to the class. There are two ways to define functions that belongs to a class: * Inside class definition ```cpp= class MyClass { // The class public: // Access specifier void myMethod() { // Method/function defined inside the class cout << "Hello World!"; } }; int main() { MyClass myObj; // Create an object of MyClass myObj.myMethod(); // Call the method return 0; } ``` * Outside class definition ```cpp= class MyClass { // The class public: // Access specifier void myMethod(); // Method/function declaration }; // Method/function definition outside the class void MyClass::myMethod() { cout << "Hello World!"; } int main() { MyClass myObj; // Create an object of MyClass myObj.myMethod(); // Call the method return 0; } ``` ### 題目 1. [Class](https://www.hackerrank.com/challenges/c-tutorial-class/problem?isFullScreen=true) 2. [Classes and Objects](https://www.hackerrank.com/challenges/classes-objects/problem?isFullScreen=true) ## Operator Overloading ### 講解 在使用Class時,我們偶爾會遇到想要直接把他們相加或比較的時候,這時直接使用 "+" 或 "==" 就會出現報錯,因為我們的函式庫不知道怎麼將他們比較。這時,我們就需要Operator Overloading 的技巧。 以下以cout為例。 ```cpp= void operator<<(ostream& COUT, Person &p){ COUT<<"Name : "<<p.Name<<endl; COUT<<"Age : "<<p.Age<<endl; } int main(){ Person person=Person(7,"Abby",'g'); cout<<person; } ``` 這樣就會輸出: ``` Name : Abby Age : 7 ``` ### 題目 1. [Box It!](https://www.hackerrank.com/challenges/box-it/problem?isFullScreen=true) ## Inheritance ### 講解 在使用Class時,有時會遇到和其他類別有相同性質的時候,這時我們就可以使用 Inheritance。例如,我們有一個類別: ```cpp= class Car{ public: string Name,Owner; int year; }; ``` 這時問題來了,車子有分電動車和汽油車,那要如何分別展示電量和油量呢? 我們可以創建兩個新類別並繼承Car的內容。 ``` class ElectricCar: public Car{ public: double Battery; }; class GasolineCar: public Car{ public: double Oil_volume; }; ``` 繼承的另一個特性是可以使用protected裡的變數及函式。 ```cpp= class factors{ public: virtual void display(){ cout<<a<<" "<<b<<endl; } protected: int a,b; }; class Times: public factors{ public: void read_input(){ cin>>a>>b; } void display(){ cout<<a*b<<endl; } }; ``` virtual 有點像預設的意思,而如果像上面的程式碼被重新定義而又想再用呢,就要用以下方法。 ```cpp= Times t; t.factors::display();//cout<<a<<" "<<b<<endl; t.display();//cout<<a*b<<endl; ``` 而virtual 有第二種用法,強制繼承那個Class的Class有某一個函式。用法如下: ```cpp= class Base { public: virtual void func1() = 0; }; class Derived : public Base { public: virtual void func1() override {//Must exist in the code, or there will be a bug cout << "Derived func1\n"; } }; ``` ### 題目 1. [Inheritance Introduction](https://www.hackerrank.com/challenges/inheritance-introduction/problem?isFullScreen=true) 2. [Rectangle Area](https://www.hackerrank.com/challenges/rectangle-area/problem?isFullScreen=true) 3. [Multi Level Inheritance](https://www.hackerrank.com/challenges/multi-level-inheritance-cpp/problem?isFullScreen=true) ## Test 這周沒有題目,希望大家可以運用這4周學到的知識來製作一個program:)。(可合作) 下面我會介紹,我自己的作品也希望你們做完後可以分享。 ### 01 種菜大師 約翰是種菜大師,她擁有5\*5的田地,還有三種種子,分別是小黃瓜、番茄和薑。 以下是他們的資訊 | 品種 | 成熟所需時間 | 價錢 | | -------- | -------- | -------- | |小黃瓜|2天|9.9| |番茄|2天|15| |薑|6天|99.9| * 他們成熟後會在(成熟所需時間/2)天後腐爛,成為肥料。 * 在有肥料的土地上成長的作物的價格收成後會乘1.5倍。 * 如果作物提早收成就只剩一半的價格。 玩家有五種動作,每個動作都會花一天的時間(有100天的時間)。 1. **移動** - 可選擇往上下左右移動一格 2. **播種** - 選擇3種作物的其中一種種植 3. **收成** - 將作物收入包包中,如果包包內有已有十個作物,則丟掉第一份被收入包包中的作物 4. **販售** - 將包包內的物品販售並清空。 5. **跳過** - 直接到下一天 * [Code](https://github.com/Benny0w0Liu/Cplusplus_assignment/blob/main/Week04/example/Vegetable_master/Vegetable_master.cpp) * [Video Demo](https://youtu.be/u-fe_EYeRDk) (處女作就先給你們了இдஇ) ### 02 踩地雷 如題,就是踩地雷 * [Code](https://github.com/Benny0w0Liu/Cplusplus_assignment/blob/main/Week04/example/Minesweeper/Minesweeper.cpp) {%hackmd @25H8NTF5SwujU3QUSA0oog/BkiNnsk56 %}