Zombie 클래스를 동적할당으로 했을때와 정적할당으로 했을때 처리를 할 수 있는지 물어보는 문제. 동적할당은 해제를 따로 해줘야하고 정적할당은 해제가 알아서 된다.
Zombie
클래스를 만들자. 좀비는 각자 priavte로 name
을 가지고 있어야 하고 announce()
로 다음을 출력해야한다.<name> BraiiiiiiinnnzzzZ...
앞의 요구사항이 충족되면, Zombie
를 생성하고, 이름짓고, 코드의 어디에선가 재사용할 수 있도록 반환하는 함수를 작성해야한다. 함수의 프로토타입은 다음과 같다.
Zombie* newZombie( std::string name );
이번에는 Zombie
를 생성하고, 스스로 announce
하도록 하는 함수를 작성. 프로토타입은 다음과 같다.
void randomChump( std::string name );
Zombie
는 적절한 때 소멸해야 한다. (좀비들이 필요없어질 때요). 그들은 사용 방식에 따라 스택 영역 또는 힙 영역에 적절히 할당되어 있어야 한다.
정수 N을 받아 N개의 좀비 객체를 할당.
단일 할당으로 모든 N좀비를 할당.
N마리의 Zombie들은 한 번에 할당한다. 그 뒤에, 각 Zombie들을 각각 이름을 부여하면서 초기화해 주어야 한다. 마지막으로, 첫 번째 Zombie의 주소값을 리턴한다.
Zombie* zombieHorde( int N, std::string name );
각 좀비를 std::string으로 할당을 했다. 하지만, string생성자에서 동적할당을 하고 string소멸자에서 해제를해주기 때문에 따로 해제를 해줄 필요가 없다.
"HI THIS IS BRAIN"
이라는 내용물을 담은 문자열을 생성하는 프로그램을 작성하라. 문자열의 주소를 담은 stringPTR
을 생성. 그리고 문자열의 참조를 담은 stringREF
생성.
이제, 문자열의 메모리상 주소를 출력. 그리고, 문자열의 주소를 stringPTR
과 stringREF
을 이용하여 각각 출력.
마지막으로, 문자열을 포인터를 이용하여 출력하고, 참조를 이용하여 출력.
참조변수에 관한 서브젝트.
한 객체가 다른 객체를 연결하는 수단.
자료형& 참조 변수명 = 변수명;
여기서 엔퍼센트&는 주소를 나타내는 &가 아니라 참조타입을 나타내는 &다. 따라서 참조 변수는 저장하는 변수와 같은 메모리를 참조하게 된다. 참조변수는 선언과 동시에 초기화를 해줘야한다.
Weapon
클래스를 만들어라. 해당 클래스는 문자열 자료형과, 해당 문자열의 상수 참조를 반환하는 getType
메소드를 포함해야 합니다. 또 수정할 수 있는setType
도 만들어라.
이제, HumanA
와 HumanB
라는 두 개의 클래스를 만들어라. 두 클래스 모두 Weapon
과 이름
, 다음과 같은 문자열을 출력하는 attack()
함수를 포함해야 한다.
NAME attacks with his WEAPON_TYPE
HumanA
는 생성자에서 Weapon
을 지니지만, HumanB
는 그렇지 않다.
HumanB
는 Weapon
이 없을 수도 있지만, 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();
}
}
const std::string getType(void)
갖고있는 무기(WEAPON_TYPE)반환
void setType(std::string set);
무기 이름 변경
이말은 즉, 참조변수를 사용하라는 뜻이다. 참조변수는 널값을 가질 수 없기 때문에 무기를 갖고있지 않으면 컴파일 자체가 안된다.
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')
{
}
위의 코드를 아래처럼 초기화를 시키는 것이 초기화 리스트이다. 참조변수를 헤더에 넣어야 하는 경우에는 특히 이 방법을 많이 사용한다.
참조변수를 쓰는것은 아니라는 뜻. 그렇다면 남은 방법은 포인터를 이용하여 주소를 가져오는 방법이 있다.
setWeapon(Weapon &w)
HumanB 클래스는 weapon클래스를 포인터로 갖고있고 주소값을 받는다.
replace
란 이름의 프로그램을 작성하라. 프로그램은 파일명과 두 개의 문자열을 인자로 받아야 한다. 두 문자열은 각각 s1
, s2
라고 한다면,
프로그램은 파일을 열고, 파일 내의 모든 s1
을 s2
로 대체한 후에 결과물을 FILENAME.replace
에 저장해야 한다.
replace
를 제외한 모든 std::string
클래스의 멤버 함수들을 사용 가능하다.
여러분의 프로그램이 제대로 동작하는지를 보여주기 위한 테스트 파일을 함께 제출.
./replace (파일이름) (찾을 문자열) (대체할 문자열)
(파일이름).replace파일로 생성
파일을 읽기만 하려면 ofstream, 파일을 쓰기만 하려면 ifstream 읽고 쓰기를 하려면 fstream을 사용해야 한다.
./replace ccc abc zzzzzz
I'mabc
apple
I'm apple
I'mzzzzzz
apple
Karen::complain("DEGUB")
->Karen::debug();를 실행
단, if, else-if문 쓰지 말것.
함수 포인터를 사용할 것
void abc(void);
void (*ptr)(void) = abc; // abc 함수의 주소를 저장하는 변수
*ptr(); // abc() 실행
std::find(배열의 첫번째 주소, 마지막 주소, 찾을 값)
return (찾은 주소값)
찾은 주소값 - 배열의 첫번째 주소 = 인덱스
포인터 안써도 되고, 스위치를 쓰라는 암시를 해준다.
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;
}