struct

Arvin Liu

Intro

Basic Idea - New Type

Problem: 現在有一個整數.... 

int x;

Problem: 現在有一個三維座標.... 

int x, y, z;

?

變數一多會很不好管理。

可不可以寫成一個                             ?

coordinate: 座標

crood3d dot;

Problem

Saving Coordinates

Problem: 現在有n個三維座標.... 

int x[100], y[100], z[100];
cin >> n;
for(int i=0; i<n; i++){
  cin >> x[i];
  cin >> y[i];
  cin >> z[i];
}

從前,你會這樣寫。

Saving Coordinates

Problem: 現在有n個三維座標.... 

int x[100], y[100], z[100];
cin >> n;
for(int i=0; i<n; i++){
  cin >> x[i];
  cin >> y[i];
  cin >> z[i];
}

從前,你會這樣寫。

struct coord{
  int x, y, z;
};
// ....
coord dot[100];
cin >> n;
for(int i=0; i<n; i++){
  cin >> dot[i].x;
  cin >> dot[i].y;
  cin >> dot[i].z;
}

現在,你可以這樣寫。

相關的變數散落一地。

相關的變數捆在一起。

Saving Coordinates

Problem: 現在有n個三維座標.... 

#include <iostream>
using namespace std;
struct coord{
  int x, y, z;
};
int main(){
  int n;
  coord dot[100];
  cin >> n;
  for(int i=0; i<n; i++){
    cin >> dot[i].x;
    cin >> dot[i].y;
    cin >> dot[i].z;
  }
}

創造一個新的形態: crood,包含著三個整數,xyz。

記得要加分號。

宣告: 把它當正常的型態就可以了。 就像int一樣宣告。

使用: (變數).(裡面的成員)。
(. 可以叫做 的)

struct宣告常放global,但放function內也可。

一個完整的範例。

Function in struct?

Saving Circle

Problem: 現在有一個圓.... (座標 + 半徑) 

沒錯,struct裡面可以再包一個struct!

struct circle{
  coord pos;
  double R;
};

Saving Circle

Problem: 現在有一個圓.... (座標 + 半徑) 

然後算出它的面積。 

struct circle{
  coord pos;
  double R;
};
struct circle{
  coord pos;
  double R;
};

double area(circle C){
  double pi = 3.1415926;
  return C.R * C.R * pi;
}

相關的變數 函數散落一地。

Saving Circle

Problem: 現在有一個圓.... (座標 + 半徑) 

然後算出它的面積。 

從前(?) 你是這樣寫。

struct circle{
  coord pos;
  double R;
};

double area(circle C){
  double pi = 3.1415926;
  return C.R * C.R * pi;
}
struct circle{
  double pi = 3.1415926;
  coord pos;
  double R;
  double area(){
    return R * R * pi;
  }
};

同理,函式也可以放進去。

就不用指定是哪個圓了。

Saving Circle

Problem: 現在有一個圓.... (座標 + 半徑) 

然後算出它的面積。 

#include <iostream>
using namespace std;
struct coord{
  int x, y;
};
struct circle{
  double pi = 3.1415926;
  coord pos;
  double R;
  double area(){
    return R * R * pi;
  }
};
int main(){
    circle C;
    C.pos.x = 0, C.pos.y = 1, C.R = 1.2;
    cout << C.pos.x << " " << C.pos.y << endl;
    cout << C.R << endl;
    cout << C.area() << endl;
}

Constructor

Saving Circle

Problem: 現在有一個圓.... (座標 + 半徑) 

然後算出它的面積。 

#include <iostream>
using namespace std;
struct coord{
  int x, y;
};
struct circle{
  double pi = 3.1415926;
  coord pos;
  double R;
  double area(){
    return R * R * pi;
  }
};
int main(){
    circle C;
    C.pos.x = 0, C.pos.y = 1, C.R = 1.2;
    cout << C.pos.x << " " << C.pos.y << endl;
    cout << C.R << endl;
    cout << C.area() << endl;
}

幹什麼東西?

變數初始化

Problem: 現在有一個整數,初始化1.... 

int x=1;

Problem: 現在有一個二維座標,初始化(0, 0).... 

crood dot; 
dot.x = dot.y = 0;
int x(1);
crood dot(0, 0);

?

變數初始化1

Problem: 現在有一個整數,初始化1.... 

Problem: 現在有一個二維座標,初始化(0, 0).... 

int x(1);
crood dot(0, 0);

還有誰會用小括號? 

函式 -> 所以你要寫一個初始化函式
a.k.a. constructor 建構子

變數初始化

Problem: 現在有一個二維座標,初始化(0, 0).... 

crood dot(0, 0);

函式 -> 所以你要寫一個初始化函式
a.k.a. constructor 建構子

struct coord{
  int x, y;
  coord(int a, int b){
    x = a, y = b;
  }
};
struct coord{
  int x, y;



};
  1. constructor名字跟struct一樣。
  2. constructor不需要回傳型態。

變數初始化2

Problem: 現在有一個二維座標,預設初始化(0, 0).... 

crood dot;

希望光是這樣dot就可以

dot.x = dot.y = 0;
struct coord{
  int x, y;
  coord(){
    x = 0, y = 0;
  }
};

變數初始化 1 + 2

Problem: 現在有一個二維座標,預設初始化(0, 0),並支援給兩個數字就初始化。.... 

struct coord{
  int x, y;
  coord(){
    x = 0, y = 0;
  }
};
struct coord{
  int x, y;
  coord(int a, int b){
    x = a, y = b;
  }
};
struct coord{
  int x, y;
  coord(){
    x = 0, y = 0;
  }
  coord(int a, int b){
    x = a, y = b;
  }
};

變數初始化 - code

Problem: 現在有一個二維座標,預設初始化(0, 0),並支援給兩個數字就初始化。.... 

#include <iostream>
using namespace std;
struct coord{
  int x, y;
  coord(){
    x=0, y=0;
  }
  coord(int a, int b){
    x=a, y=b;
  }
  void print(){
    printf("(%d, %d)\n", x, y);
  }
};
int main(){
  coord A;
  coord B(1, 2);
  A.print();
  B.print();
}
# Output:
(0, 0)
(1, 2)

Default Constructor

Default Constructor 

struct coord{
  int x, y;
  coord(){
    x=0, y=0;
  }
  coord(int a, int b){
    x=a, y=b;
  }
};
int main(){
  coord A;
}
int main(){
  coord A;
}
struct coord{
  int x, y;
  // 沒有任何建構子的時候,
  // 程式會自己建立預設建構子。
  // coord(){}
};

coord A會對應
到coord()的建構子。

沒建構子給coord A對應?

struct沒有建構子,
程式就會自己加預設建構子。

預設建構子沒有參數也不會做事。

struct coord {
  int x, y;
  coord (int _x, int _y){
    x = _x, y = _y;
  }
};
struct crood {
  int x, y;
  coord (){x = y = 0;}
  coord (int _x, int _y) {
    x = _x, y = _y;
  }
};
coord c;

宣告

使用

coord c;
struct coord {
  int x, y;
};
coord c;

error: no matching function for call to ‘coord::coord()’

OK : 符合其中一個自己寫的建構子

OK : 使用預設建構子

  • 預設建構子只有在沒有寫建構子才會出來。

Default Constructor

Common Mistakes

常見錯誤

  • 記得要加分號
  • 建構子不需要type,也不需要回傳值(return)。
  • 函式參數名稱(包括建構子)和成員名稱相撞?
struct coord {
  int x, y;
  coord (int x, int y) {
    x = x, y = y;
  }
};
struct coord {
  int x, y;
  coord (int _x, int _y) {
    x = _x, y = _y;
  }
};
struct coord {
  int x, y;
  coord (int x, int y) {
    this -> x = x;
    this -> y = y;
  }
};

this -> 的用法 2!可能會教(?)

Review

啥時要寫struct?

  • 方便管理變數。
    • 你會很清楚的知道那些變數是屬於那些類別。
      假設一個怪獸有血量,位置,屬性,你可以直接用monster.hp / monster.position 比較不會搞混。
  • 使用constructor建構子可以快速初始化。
  • 增加程式的可讀性。
    • 這樣Debug也會更加容易:)。

如何寫一個struct?

  • 定義型態 - 座標struct
    • struct的成員
      •  
      •  
    • struct的建構子
      • 沒參數
        • 都初始化為0。
      • 兩個參數
        • 直接放進去。
    • 一個函數 f
      •  
struct coord {
  
  int x;
  int y;
  
  coord () {
    x = y = 0;
  }
  
  coord (int _x, int _y) {
    x = _x;
    y = _y;
  }
  
  int f () {
    return x * y ;
  }

};
int x;
int y;
return x*y;

如何用一個struct?

  • 宣告座標c,初始化(0, 0)


     
  • 宣告座標c,初始化(2, 3)

     
  • 印出座標c的x軸資訊

     
  • 印出座標c的
struct coord {
  
  int x;
  int y;
  
  coord () {
    x = y = 0;
  }
  
  coord (int _x, int _y) {
    x = _x;
    y = _y;
  }
  
  int f () {
    return x * y ;
  }

};
coord c;
xy
coord c();
coord c(2, 3);
cout << c.x;
cout << c.f();

struct

By Arvin Liu

struct

  • 347