Box

情報処理技術演習
第03回 UMLとC++(2)
第2回目の課題1
n 切手販売を行う自動販売機がある。これをクラス
図を使って表しなさい。
ただし、切手販売クラスは自動販売機クラスを継
承して作成すること。
、そこで利用される
n また、自動販売機だけではなく
切手やお金の関係も表現すること。
n
08.Jan.2003
03: UMLとC++(2) - [email protected]
2
第2回目の課題2
p 次のクラス図で表されるBOXクラスを作成しなさい。た
だし、それぞれの関数の内容は次のページの通り。
Box
- xlen: int
- ylen: int
- zlen: int
+ set(x: int, y: int, z: int): void
+ getX( ): int
+ getY( ): int
+ getZ( ): int
+ show( ): void
08.Jan.2003
03: UMLとC++(2) - [email protected]
3
第2回目の課題2(
2)
n
Box クラスのメンバ関数の内容
1. set(x:int, y:int, z:int): void
n 与えられた各辺の長さx, y, z を xlen, ylen, zlen にそれ
ぞれ代入する関数
2. getX( ): int
3. getY( ): int
4. getZ( ): int
n オブジェクトの持つ値を返す関数。上から xlen, ylen,
zlen の値を返す。
5. show(): void
n オブジェクトの持つすべてのメンバ変数を画面に表示す
る関数
08.Jan.2003
03: UMLとC++(2) - [email protected]
4
第2回目の課題2(
3)
n ただし、main 関数は以下のようにして、その結果も提出
しなさい。
int main()
main() {{
int
Box box1;
box1;
Box
int x,
x, y,
y, z;
z;
int
box1.set(10, 20,
20, 30);
30);
box1.set(10,
box1.getX(); yy == box1.getY();
box1.getY(); zz == box1.getZ();
box1.getZ();
xx == box1.getX();
cout <<
<< “(x,
“(x, y,
y, z)
z) == (“
(“ <<
<< xx <<
<< ‘,’
‘,’ <<
<< yy <<
<< ‘,‘
‘,‘ <<
<< zz <<
<< “)¥n”;
“)¥n”;
cout
box1.show();
box1.show();
return 0;
0;
return
}}
08.Jan.2003
03: UMLとC++(2) - [email protected]
5
第2回目の課題3
p
これまでに作成したBoxクラスに対してコンストラクタ、及び、デスト
ラクタを付け加えよ。
p なお、それぞれの関数では以下の処理を行う
n コンストラクタ
§ 初期値を(xlen, ylen, zlen)=(100, 100, 100) に設定
n デストラクタ
§ 現在の (xlen, ylen, zlen) の値を表示
Box
- xlen: int
- ylen: int
- zlen: int
+ Box( )
+ ~Box( )
08.Jan.2003
+ set(x: int, y: int, z: int): void
+ getX( ): int
+ getY( ): int
+ getZ( ): int
+ show( ): void
03: UMLとC++(2) - [email protected]
6
第2回目の課題4
p 作成したBox クラスを継承して、色を表すメンバ変数を
付け加えたクラス ColoredBox を作成しなさい。
Box
ColoredBox
- color: string
- xlen: int
- ylen: int
- zlen: int
+ ColoredBox( )
+ ~ColoredBox( )
+ set(x: int, y: int, z: int, ccolor: string): void
+ getColor( ): string
+ show( ): void
+ Box( )
+ ~Box( )
+ set(x: int, y: int, z: int): void
+ getX( ): int
+ getY( ): int
+ getZ( ): int
+ show( ): void
string を利用する場合は
#include <string>
を始めの部分に挿入すること。
08.Jan.2003
03: UMLとC++(2) - [email protected]
7
オブジェクト指向言語 C++
Object-Oriented Language C++
コンストラクタの引数(
1)
n コンストラクタの引数の利用
n
オブジェクト生成時に呼ばれるコンストラクタに引
数を渡すことが出来る
n
n
基本的にはこれまでのコンストラクタと同じ
n
n
クラス名( )
丸括弧の中に、引数を書き入れることが可能
n
08.Jan.2003
一般の関数と同じように丸括弧の中に記述
例: クラス名(int x, int y)
03: UMLとC++(2) - [email protected]
9
コンストラクタの引数(
2)
n コンストラクタの引数の例
Point::Point(int xx,
xx, int
int yy)
yy) {{
Point::Point(int
xx;
xx == xx;
yy;
yy == yy;
}}
クラスの定義
class Point
Point {{
class
private:
private:
int x;
x;
int
int y;
y;
int
public:
public:
void setXY(int
setXY(int xx,
xx, int
int yy);
yy);
void
void show();
show();
void
// Point();
Point();
//
Point(int xx,
xx, int
int yy);
yy);
Point(int
};
};
クラスの宣言
08.Jan.2003
03: UMLとC++(2) - [email protected]
引数を追加
10
コンストラクタの引数(
3)
n コンストラクタの引数の例(
続き)
int main()
main() {{
int
Point p1(123,456);
p1(123,456);
Point
p1.show();
p1.show();
return 0;
0;
return
}}
08.Jan.2003
メイン
03: UMLとC++(2) - [email protected]
11
課題1
1.
前回までの課題で作成した Box クラスを変更し、コンストラクタに
引数を与えられるようにしなさい。
p
p
このことにより、オブジェクト生成時に二つのメンバ変数 xlen,
ylen, zlen の初期値を与えられるようになる。
ヒント: これまでBox( ) としてコンストラクタを宣言、定義して
いた部分を、
Box
Box(int x, int y, int z)
- xlen: int
と変更して、それらの値を初期値 - ylen: int
- zlen: int
として代入
レポートとしてプログラムと実行結果
を提出せよ
08.Jan.2003
+ Box( x: int, y: int, z: int )
+ ~Box( )
+ set(x: int, y: int, z: int): void
+ getX( ): int
+ getY( ): int
+ getZ( ): int
+ show( ): void
03: UMLとC++(2) - [email protected]
12
継承とコンストラクタ(1)
n コンストラクタ
n
n
サブクラスのコンストラクタでは、スーパークラスのコンスト
ラクタを呼ぶ
スーパークラスのコンストラクタに引数がある場合は、コン
ストラクタ定義部分で引数を受け渡すよう記述する
サブクラスの
コンストラクタ
スーパークラスの
コンストラクタ
08.Jan.2003
03: UMLとC++(2) - [email protected]
13
継承とコンストラクタ(2)
n 継承とコンストラクタの例
class Point
Point {{
class
private:
private:
int x,
x, y;
y;
int
public:
public:
Point();
Point();
::
};
};
class Point3D
Point3D :: public
public Point
Point {{
class
private:
private:
int z;
z;
int
public:
public:
Point3D();
Point3D();
::
};
};
08.Jan.2003
03: UMLとC++(2) - [email protected]
14
継承とコンストラクタ(3)
n 継承とコンストラクタの例
n
コンストラクタの定義部でスーパークラスのコンストラクタの
呼び方を指定
Point3D::Point3D() {{
Point3D::Point3D()
0;
zz == 0;
}}
この場合は Pointクラスのコンストラクタ
としては Point( ) が呼ばれる
Point3D::Point3D(int xx,
xx, int
int yy,
yy, int
int zz)
zz) :: Point(xx,
Point(xx, yy)
yy) {{
Point3D::Point3D(int
zz;
zz == zz;
}}
この場合は Pointクラスのコンストラクタ
としては Point(xx, yy) が呼ばれる
08.Jan.2003
03: UMLとC++(2) - [email protected]
15
多重継承(
1)
n 多重継承
n
複数のクラスを継承すること
n 複数のクラスの属性と操作をそのまま引き継ぐこと
SuperClass1
SuperClass2
SuperClass3
SubClass
class ク
ク
ラ
ス名 :: public
public スーパークラ
スーパークラ
ス名1,
class
ラ
ス名
ス名1,
public スーパークラ
スーパークラ
ス名2,
public
ス名2,
public スーパークラ
スーパークラ
ス名3 {{
public
ス名3
メンバ定義;
メンバ定義;
}}
08.Jan.2003
03: UMLとC++(2) - [email protected]
16
多重継承(
2)
n 多重継承の例
A
B
C
class AA {{
class
private:
private:
int a;
a;
int
AA
public:
public:
void set(int
set(int aa);
aa);
void
::
};
};
class AA
AA :: public
public A,
A, public
public B,
B, public
public CC {{
class
class BB {{ ....
.... };
};
class
private:
private:
class CC {{ ....
.... };
};
class
int aa;
aa;
int
public:
public:
void set(int
set(int aaa);
aaa);
void
::
};
};
08.Jan.2003
03: UMLとC++(2) - [email protected]
17
課題2
n 以下に示すクラス図をもとにプログラムを作成しなさい。
Person
Student
- name: string
# age: int
# birthday: string
+ Person(nname: string, aage: int)
+ getName( ): string
# setName(nname: string): void
+ Student(nname: string, aage: int,
bbirthday: string)
+ show( ): void
Teacher
- room: string
show は name, age, birthday,
room(Teacher クラスの場合のみ)
を出力するメンバ関数
08.Jan.2003
+ Teacher(nname: string, aage: int,
bbirthday: string, rroom: string)
+ show( ): void
03: UMLとC++(2) - [email protected]
18
課題2(
2)
n 実行結果として以下のようになるようにプログラム全体を作成しなさい。
Student: Yamakawa
Yamakawa (20)
(20) ––
Student:
Teacher: Nagasaka
Nagasaka (36)
(36) ––
Teacher:
N4-521
N4-521
13.Jun
13.Jun
01.Feb
01.Feb
n メイン部の一部
Student yamakawa(“Yamakawa”,
yamakawa(“Yamakawa”, 20,
20, “13.Jun”);
“13.Jun”);
Student
Teacher nagasaka(“Nagasaka”,
nagasaka(“Nagasaka”, 36,
36, “01.FEB”,
“01.FEB”, “N4-521”);
“N4-521”);
Teacher
yamakawa.show();
yamakawa.show();
nagasaka.show();
nagasaka.show();
08.Jan.2003
03: UMLとC++(2) - [email protected]
19
多重定義
n 多重定義(
Overload)
n
一つの演算子や関数に対して、複数の機能を多重に定義する
こと
n
n
異なる振る舞いをする関数を同じ名前で定義
それぞれは、関数の引数の数と型で区別
§ ただし、戻り値の型では区別しない
n
戻り値は違っても良い
購入
(
オブジェクトの操作)
買うもの
08.Jan.2003
本
図書券を持って
本屋で購入
文具
文具券を持って
文房具屋で購入
靴
現金を持って
靴屋で購入
03: UMLとC++(2) - [email protected]
20
多重定義(
2)
n 多重定義の例
n print 関数
n 引数で与えられた変数の表示
print
print_char
char型の表示
print_int
int型の表示
print_double
double型の表示
print_string
string型の表示
print
08.Jan.2003
03: UMLとC++(2) - [email protected]
21
多重定義の例
n add 関数– 与えられた二つの引数の値を加える
int 型引数が与えられた場合
⇒ int 型の結果(戻り値)
int add(int a, int b);
n double 型引数が与えられた場合
⇒ double 型の結果(戻り値)
double add(double a, doube b);
n char 型引数が与えられた場合
⇒ string 型の結果(戻り値)
string add(char a, char b);
n
08.Jan.2003
03: UMLとC++(2) - [email protected]
22
多重定義の例(
2)
n Class の宣言
n 三つの add 関数の宣言
class Calc
Calc {{
class
public:
public:
int
add(int a,
a,
int b);
b);
int
add(int
int
double add(double
add(double a,
a, double
double b);
b);
double
string add(char
add(char a,
a, char
char b);
b);
string
};
};
08.Jan.2003
03: UMLとC++(2) - [email protected]
23
多重定義の例(
3)
n Class の定義(
1)
int Calc::add(int
Calc::add(int a,
a, int
int b)
b) {{
int
int res;
res;
int
res == aa ++ b;
b;
res
return res;
res;
return
}}
double Calc::add(double
Calc::add(double a,
a, double
double b)
b) {{
double
double res;
res;
double
res == aa ++ b;
b;
res
return res;
res;
return
}}
08.Jan.2003
03: UMLとC++(2) - [email protected]
24
多重定義の例(
4)
n Class の定義(
2)
string Calc::add(char
Calc::add(char a,
a, char
char b)
b) {{
string
string res,
res, aa,
aa, bb;
bb;
string
aa == a;
a;
aa
bb == b;
b;
bb
res == aa
aa ++ bb;
bb;
res
return res;
res;
return
}}
文字列を
扱う
ため、
#include<iostream>
<iostream>のほか、
のほか、
文字列を
扱う
ため、
#include
#include<string>
<string>
#include
が必要
が必要
08.Jan.2003
03: UMLとC++(2) - [email protected]
25
多重定義の例(
5)
n Main
int main()
main() {{
int
int i;
i;
int
double d;
d;
double
string s;
s;
string
#include <iostream>
<iostream>
#include
#include <string>
<string>
#include
using namespace
namespace std;
std;
using
Calc cal;
cal;
Calc
cal.add(21,34);
ii == cal.add(21,34);
cout <<
<< "i
"i == "" <<
<< ii <<
<< "¥n";
"¥n";
cout
cal.add(1.2, 4.3);
4.3);
dd == cal.add(1.2,
cout <<
<< "d
"d == "" <<
<< dd <<
<< "¥n";
"¥n";
cout
cal.add('A', 'C');
'C');
ss == cal.add('A',
cout <<
<< "s
"s == "" <<
<< ss <<
<< "¥n";
"¥n";
cout
return 0;
0;
return
}}
08.Jan.2003
03: UMLとC++(2) - [email protected]
26
課題3
3. 多重定義の例を実際にプログラミングして、その振る舞
いを調べなさい。
>> レポートとしてプログラムと実行結果を提出せよ
55
ii == 55
5.5
dd == 5.5
AC
ss == AC
08.Jan.2003
実行結果
03: UMLとC++(2) - [email protected]
27
課題4
4.
コンストラクタの多重定義(
オーバーロード)
も可能である。そこで、
これまでに作成した Box クラスに対して、
a) 引数を与えない場合
b) x, y 変数のみ値を与える場合
c) すべての変数の値を与える場合
の三つの場合に対応できるコンスト
ラクタを作成しなさい。
また、実行結果として上記の変更
が確認できるようなメイン関数部を
作成しなさい。
レポートとしてプログラムと実行結果を
提出せよ
08.Jan.2003
Box
- xlen: int
- ylen: int
- zlen: int
+ Box( )
+ Box( x: int, y: int )
+ Box( x: int, y: int, z: int )
+ ~Box( )
+ set(x: int, y: int, z: int): void
+ getX( ): int
+ getY( ): int
+ getZ( ): int
+ show( ): void
03: UMLとC++(2) - [email protected]
28