5일차 정리
overidding
부모클래스는 안쓰는 경우
:: 클래스 내부에 함수를 만듬.
#include "stdafx.h"
#include <iostream>
using namespace std;
class Area{
protected:
double height;
double width;
public:
void SetValue(double num1, double num2);
};
void Area::SetValue(double num1, double num2){
// ' :: ' 는 Area클래스 안에 선언이 있음을 나타내어주는 것
height = num1;
width = num2;
}
class quadrangle : public Area {
public:
double GetExtent(){
return height * width;
}
};
class triangle : public Area{
public:
double GetExtent(){
return height * width / 2;
}
};
int main(int argc, char* argv[])
{
quadrangle qu;
qu.SetValue(1,2);
cout << " 사각형 : " << qu.GetExtent() << endl;
triangle tr;
tr.SetValue(1,2);
cout << " 삼각형 : " << tr.GetExtent() << endl;
return 0;
}
--------------------
이름을 맞춰서하자!
GET, SET
콜론초기화----------
class AAA{
const int num;//값을 할당하지 못한다. 고유의 영역 const =변경할 수 없는수
public:
AAA(int x):num(x){//그래서 num=10처럼 만든 것이 initializer
cout<<"num= " << num << endl;
}
};
void main(){
AAA a(10);
}
-------상수
using namespace std;
void main(){
const int num = 10;
num =20;
} // 오류가 남 const는 값을 할당할 수 없슴.
상수 객체-----------
----------------다중상속
--------------------------
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class AAA{
public:
void display(){
cout << "AAA" << endl;
}
};
class BBB {
public:
void display(){
cout << "BBB" << endl;
}
};
class CCC : public AAA, public BBB {
};
void main (){
CCC c;
c.AAA::display(); /*네임스페이스('::')를 이용하여 불러옴
그러나 미봉책이며 virtual public을 이용하면
오류를 해결할 수 있다.*/
}
----------------virtual public
가상의 같은 이름의 공간에 변수를 만들어 넣음
가상상속 =/=가상함수
부모클래스에서 선언만, 자식은 정의하여 실제 사용
-------------------------------
class Mammal{
protected:
int Age;
public:
Mammal(){
Age=4;
}
};
class Dog: virtual public Mammal{
public:
Dog(){Age=4;}
};
class Cat:virtual public Mammal{
public:
Cat(){Age=6;}
};
class Pet:public Dog, public Cat{
public:
void Display(){
cout<<Age<<endl;
}
};
void main(){
Pet Pet;
Pet.Display();
}
------------------------실행결과
6
계속하려면 아무 키나 누르십시오 . . .
예제 2-----------------
mammal자료형으로 진도 객체를 만듬
부모
------------
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Mammal{
public:
void speak(int cnt){
cout<<cnt<<"번 짖다\n";
}
virtual void speak()=0;// '=0'을 쓴 이유
// 순수 가상함수 = '0'자식 클레스에서 만들 것이다
//부모는 선언만하고 자식클래스에서 만들겠다. 추상화라고 부름
};
class Dog:public Mammal{
public:
void speak(){
cout<<"멍멍\n";
}
};
void main(){
Mammal *pt;
Dog jindo;
pt= &jindo;
pt->speak();
pt->speak(5);
}
---------------실행결과
멍멍
5번 짖다
계속하려면 아무 키나 누르십시오 . . .
-----------------예제
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Mammal{
public:
virtual void speak(){
cout<<"짖다\n";
}
};
class Dog:public Mammal{
public:
void speak(){
cout<<"멍멍";
}
};
void Display(Mammal *ptr){//새로운 객체
ptr->speak();
}
void main(){
Dog jindo;
Mammal mammal;
Display(&mammal); //부모클래스를 상속하지 않으면 원래 가지고 있던 내용이 나온다.
Display(&jindo); //가상함수는 자식 클래스 내용이 나옴
}
-------------------실행결과
짖다
멍멍계속하려면 아무 키나 누르십시오 . . .
----------가상함수 마무리
가상 상속 때문에 알아봄.
가상 함수 =/=가상 상속
---------------------------
using namespace std;
class Figure{
public:
virtual void Display()=0;
};
class Star: public Figure{
void Display(){
cout<<"★";
}
};
class Heart: public Figure{
void Display(){
cout<<"♡";
}
};
void main(){
Figure *fig[10];
Star sta;
fig[0]=&sta;
Heart har1, har2;
fig[1]=&har1;
fig[2]=&har2;
fig[3]=NULL;
int i;
for(i=0; fig[i] != NULL; i++) //\0 = null
fig[i] -> Display();
cout <<endl;
}
----------결과
★♡♡
계속하려면 아무 키나 누르십시오 . . .
이전 예제의 Figure 클래스를 상속받는 Clover 클래스를 만드시오.
Figure의 Display함수를 Overridding 하여 ♧을 출력하는 함수를 만드시오.---------
---------------------
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Figure{
public:
virtual void Display()=0; //자식 값에서 재정의한다. ( Overridding )
};
class Star: public Figure{
void Display(){
cout<<"★";
}
};
class Heart: public Figure{
void Display(){
cout<<"♡";
}
};
class Clover: public Figure {
void Display(){
cout <<"♧";
}
};
void main(){
Figure *fig[10];
Star sta;
fig[0]=&sta;
Heart har1, har2;
fig[1]=&har1;
fig[2]=&har2;
Clover clo;
fig[3]=&clo;
fig[4]=NULL;
int i;
for(i=0; fig[i] != NULL; i++) //\0 = null
fig[i] -> Display();
cout <<endl;
}
----------------------- p 101
아래의 단계별로 계산기를 클래스로 구성하시오---------------
main에서 계산기를 만드시오.(메뉴로 구성하시오.)
•‘+’ , ‘-’ , ‘*’ , ‘/’ 연산을 처리하도록 구성하시오.
연산하는 부분을 클래스로 구성하시오.
0으로 나누는 상황이 온다면 값을 다시 입력 받으시오.
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
void menu(int* x,int* y,char* c)
{
cin>>*x >> *c >> *y;
}
void main()
{
int x,y = 0;
char c;
while(1)
{
menu(&x,&y,&c);
switch(c)
{
case '+':
cout<<x<<c<<y<<"= "<<x+y<<endl;
break;
case '-':
cout<<x<<c<<y<<"= "<<x-y<<endl;
break;
case '*':.
cout<<x<<c<<y<<"= "<<x*y<<endl;
break;
case '/':
cout<<x<<c<<y<<"= "<<x/y<<endl;
break;
}
fflush(stdin);
cout<<"계속 하시겠습니까? (y/n) :";
cin>>c;
if(c == 'n')
{
break;
}
system("cls");
}
}
---------------------
위의 계산기 클래스를 상속받는 공학용 계산기 클래스를 구성하시오-----
절대값 , 제곱을 구하는 기능을 추가하시오
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
void menu(int* x,int* y,char* t)
{
cout<<"┌────────┐"<<endl;
cout<<"│절대값은 수|수 │"<<endl;
cout<<"│제곱은 ^ │"<<endl;
cout<<"└────────┘"<<endl;
cin>>*x >> *t >> *y;
}
class Calc{
public:
int plus(int su, int su2){return su + su2;}
int sub(int su, int su2){return su - su2;}
int mut(int su, int su2){return su * su2;}
int div(int su, int su2){return su / su2;}
int abs1(int su){
if(su < 0){su = su * -1;}
return su;
}
int abs2(int su2){
if(su2 < 0){su2 = su2 * -1;}
return su2;
}
int squar(int su, int su2){
int sq=1;
for(int i=1; i <= su2; i++){
sq=sq * su;
}
return sq;
}
};
void main()
{
int x,y = 0;
char c;
Calc cal;
while(1)
{
menu(&x,&y,&c);
switch(c)
{
case '+':
cout<<x<<c<<y<<"= "<< cal.plus(x,y)<<endl;
break;
case '-':
cout<<x<<c<<y<<"= "<<cal.sub(x,y)<<endl;
break;
case '*':
cout<<x<<c<<y<<"= "<<cal.mut(x,y)<<endl;
break;
case '/':
cout<<x<<c<<y<<"= "<<cal.div(x,y)<<endl;
break;
case '|':
cout<<x<<c<<y<<"= "<< "값은 "<< cal.abs1(x) << "과 "<< cal.abs2(y) << endl;
break;
case '^':
cout<<x<<c<<y<<"= "<<cal.squar(x,y)<<endl;
break;
}
fflush(stdin);
cout<<"계속 하시겠습니까? (y/n) :";
cin>>c;
if(c == 'n')
{
break;
}
system("cls");
}
}