cpp module 01

slee2·2021년 9월 6일
1

42Seoul

목록 보기
10/15

ex00

Zombie 클래스를 동적할당으로 했을때와 정적할당으로 했을때 처리를 할 수 있는지 물어보는 문제. 동적할당은 해제를 따로 해줘야하고 정적할당은 해제가 알아서 된다.

  1. Zombie 클래스를 만들자. 좀비는 각자 priavte로 name을 가지고 있어야 하고 announce()로 다음을 출력해야한다.
<name> BraiiiiiiinnnzzzZ...

앞의 요구사항이 충족되면, Zombie를 생성하고, 이름짓고, 코드의 어디에선가 재사용할 수 있도록 반환하는 함수를 작성해야한다. 함수의 프로토타입은 다음과 같다.

Zombie* newZombie( std::string name );

이번에는 Zombie를 생성하고, 스스로 announce하도록 하는 함수를 작성. 프로토타입은 다음과 같다.

void randomChump( std::string name );

Zombie는 적절한 때 소멸해야 한다. (좀비들이 필요없어질 때요). 그들은 사용 방식에 따라 스택 영역 또는 힙 영역에 적절히 할당되어 있어야 한다.

ex01

정수 N을 받아 N개의 좀비 객체를 할당.
단일 할당으로 모든 N좀비를 할당.

N마리의 Zombie들은 한 번에 할당한다. 그 뒤에, 각 Zombie들을 각각 이름을 부여하면서 초기화해 주어야 한다. 마지막으로, 첫 번째 Zombie의 주소값을 리턴한다.

Zombie* zombieHorde( int N, std::string name );

각 좀비를 std::string으로 할당을 했다. 하지만, string생성자에서 동적할당을 하고 string소멸자에서 해제를해주기 때문에 따로 해제를 해줄 필요가 없다.

ex02

"HI THIS IS BRAIN" 이라는 내용물을 담은 문자열을 생성하는 프로그램을 작성하라. 문자열의 주소를 담은 stringPTR 을 생성. 그리고 문자열의 참조를 담은 stringREF 생성.

이제, 문자열의 메모리상 주소를 출력. 그리고, 문자열의 주소를 stringPTRstringREF을 이용하여 각각 출력.

마지막으로, 문자열을 포인터를 이용하여 출력하고, 참조를 이용하여 출력.

참조변수에 관한 서브젝트.

참조변수

한 객체가 다른 객체를 연결하는 수단.
자료형& 참조 변수명 = 변수명;

여기서 엔퍼센트&는 주소를 나타내는 &가 아니라 참조타입을 나타내는 &다. 따라서 참조 변수는 저장하는 변수와 같은 메모리를 참조하게 된다. 참조변수는 선언과 동시에 초기화를 해줘야한다.

ex03

Weapon 클래스를 만들어라. 해당 클래스는 문자열 자료형과, 해당 문자열의 상수 참조를 반환하는 getType메소드를 포함해야 합니다. 또 수정할 수 있는setType도 만들어라.

이제, HumanAHumanB라는 두 개의 클래스를 만들어라. 두 클래스 모두 Weapon이름, 다음과 같은 문자열을 출력하는 attack() 함수를 포함해야 한다.

NAME attacks with his WEAPON_TYPE

HumanA는 생성자에서 Weapon을 지니지만, HumanB는 그렇지 않다.
HumanBWeapon이 없을 수도 있지만, HumanA는 항상 무장한 상태이다.

다음과 같은 코드가 아래의 두 가지 경우 모두 "crude spiked club""some other type of club"으로 공격할 수 있도록 하라.

int main()
{
  {
    Weapon club = Weapon("crude spiked club");
    HumanA bob("Bob", club);
    bob.attack();
    club.setType("some other type of club");
    bob.attack();
  }
  {
    Weapon club = Weapon("crude spiked club");
    HumanB jim("Jim");
    jim.setWeapon(club);
    jim.attack();
    club.setType("some other type of club");
    jim.attack();
  }
}

class Weapon

const std::string getType(void)

갖고있는 무기(WEAPON_TYPE)반환

void setType(std::string set);

무기 이름 변경

class HumanA

서브젝트에 보면 HumanA는 무기를 항상 갖고잇어야 한다고 말한다.

이말은 즉, 참조변수를 사용하라는 뜻이다. 참조변수는 널값을 가질 수 없기 때문에 무기를 갖고있지 않으면 컴파일 자체가 안된다.

HumanA(std::string _name, Weapon& w)

weapon클래스를 참조변수로 넣어, 같은 메모리를 사용해야한다. 참조변수는 생성과 동시에 초기화를 해야하는 규칙이 있지만, 헤더에서는 선언과 동시에 초기화가 안된다. 그래서 초기화리스트라는 기능을 사용해야한다.

Something()
{
	m_value = 1;
	m_value2 = 2.2;
	m_valule3 = 'c';
}

Something() : m_nalue1(1), m_value2(2.2), m_value3('c')
{
}

위의 코드를 아래처럼 초기화를 시키는 것이 초기화 리스트이다. 참조변수를 헤더에 넣어야 하는 경우에는 특히 이 방법을 많이 사용한다.

class HumanB

HumanB는 무기를 가지고 있지 않을때도 있다고 한다.

참조변수를 쓰는것은 아니라는 뜻. 그렇다면 남은 방법은 포인터를 이용하여 주소를 가져오는 방법이 있다.

setWeapon(Weapon &w)

HumanB 클래스는 weapon클래스를 포인터로 갖고있고 주소값을 받는다.

ex04

replace란 이름의 프로그램을 작성하라. 프로그램은 파일명과 두 개의 문자열을 인자로 받아야 한다. 두 문자열은 각각 s1, s2라고 한다면,
프로그램은 파일을 열고, 파일 내의 모든 s1s2로 대체한 후에 결과물을 FILENAME.replace에 저장해야 한다.

replace를 제외한 모든 std::string 클래스의 멤버 함수들을 사용 가능하다.

여러분의 프로그램이 제대로 동작하는지를 보여주기 위한 테스트 파일을 함께 제출.

replace

./replace (파일이름) (찾을 문자열) (대체할 문자열)
(파일이름).replace파일로 생성

ifstream, ofstream, fstream

파일을 읽기만 하려면 ofstream, 파일을 쓰기만 하려면 ifstream 읽고 쓰기를 하려면 fstream을 사용해야 한다.

./replace ccc abc zzzzzz
I'm abc apple
I'm  apple
I'm zzzzzz apple

ex05

Karen

Karen::complain("DEGUB")
->Karen::debug();를 실행
단, if, else-if문 쓰지 말것.
함수 포인터를 사용할 것

void	abc(void);

void	(*ptr)(void) = abc;	// abc 함수의 주소를 저장하는 변수

*ptr();				// abc() 실행

find

std::find(배열의 첫번째 주소, 마지막 주소, 찾을 값)
return (찾은 주소값)
찾은 주소값 - 배열의 첫번째 주소 = 인덱스

ex06

Karen

포인터 안써도 되고, 스위치를 쓰라는 암시를 해준다.

Switch

switch(i)
{
	case 0:
   		std::cout << "abc" << std::endl;
   	   	break;	// 스위치문은 break;을 이용해 반복문을 빠져나오지 않으면 밑으로 계속 진행된다.
   	case 1:
   		std::cout << "abc" << std::endl;
   	case 2:
   		std::cout << "bbc" << std::endl;
   	default:
   		std::cout << "ccc" << std::endl;
}

0개의 댓글