1장) 각자의 클래스에 speak()함수를 구현했기에, 각자에 맞게 호출되는 모습이다. 하지만, 상속이라는 개념을 사용하는 것 자체가 편리하기 때문에 사용하는 것일텐데. Animal* ptr_animal1 = &cat;을 한다면, 자료형 자체는 Animal*이기 때문에, Animal클래스로 해석해버려서 ???가 나온다. 우리가 원하는 방향이 아닌데, 이럴 땐 어떻게 해야하나. 해결책은 부모와 자식의 클래스가 같은 경우, 오버라이딩을 하고 싶은 함수에 virtual을 부모클래스 있는 곳에 선언해주면 된다. 2장) 자료형이 A이기 때문에, "A"가 출력된다. 우리가 원하는 건, B가 프린트되는 것이기에, A의 함수에 virtual을 선언함으로써, B의 print()함수가 나올 수 있게 되었다. 여기서 신기하..
https://blog.naver.com/sss9073/222145800980 Chapter 11-5. 상속과 접근 지정자 * 블로그에 따라배우는 C++ 관련 모든 코드와 사진들의 저작권은 강의의 저자이신 홍정모 교수님께 있습니... blog.naver.com 네이버 블로그의 내 글을 참고하면서 복습해보자.
Patient 클래스는 Doctor의 클래스를 순서상 알지 못한다. 그렇기에 전방 선언을 해줌으로써, Doctor 클래스가 있음을 알려주긴 했다. 하지만 그럼에도, Doctor 클래스 안의 멤버나 메소드들은 알지 못하기에, 27번 줄에서 오류가 난다. Doctor들의 m_name이 있는지 모르기 때문. 그렇다면 해결책은 ? Doctor클래스가 필요한 함수를 Doctor 클래스 선언 이후에 놓는 것이다. 그러면 그제서야 아 Doctor클래스에 저런 것들이 있지 하면서 활용할 수 있겠지. 물론 기존에는 프로토타입만 선언해놓고.(void meetDoctors();) #include #include #include using namespace std; class Doctor;// forward declarati..
기존에 배운 구성 관계로 코드를 짠다면, 현재 "Jack Jack"이라는 학생은 동일 학생이니, 내가 lec2.study()를 한다면, lec1에 있는 jack jack이나 lec2에 있는 jack jack이나 다 지능이 1 올라가야하는데, lec1에선 올라가지 않는다. 근데 이 결과는 당연하다. 해당 값들을 call-by-value로 그냥 값을 복사해서 넣어주는 것이니 당연할 수 밖에. 그렇다면, 이걸 하고 싶다면? 포인터를 이용해보는 것이 적당해보인다. _____________________________________________________________________________________________________________________________ 값을 포인터로 줬기 때문에..
단순히 이렇게 보면 뭔 소리인지 모르니, 관계 하나하나씩 코드를 보면서 이해해보도록 해보자. 우선 이 포스트에서 다룰 건 구성(composition)관계이다. Monster.h와 Position2D.h를 집중해서 보자. Monster 클래스가 다른 헤더파일에 있는 Position2D클래스를 가져와서 사용하고 있다. 그런데 이 관계를 잘 생각해보자. Monster 객체 하나가 생성되고 나서, Monster 객체가 Positition2D 클래스에 영향을 끼치는가? 아니다. 그저 값들을 가져와서 사용할 뿐이다. 즉, 멤버의 존재만 관리할 뿐이다. 내가 Monster1과 Monster2 각각 객체를 생성해서 활용한다한들, 각 객체 안의 Position2D 객체는 거기 안에서 독립적으로 작용한다. 서로 영향을 끼..
chapter 9-11. copy = hello; 이렇게 값의 복사를 진행했다면. default copy constructor로 인해(얉은 복사), 우선은 hello.getstring()이나 copy.getstring()이나 둘다 동일하게 m_data를 출력할 것이다. 그런데 , 우리는 메모리 누수를 방지하기 위해, 생성자에서 new를 해줬다면, 소멸자에서 delete을 해줘야한다 배웠다. 그렇다면 문제가 생긴다. 복사를 했기에, hello객체와 copy 객체는 m_data를 공유한다(정확히 표현하자면, 동일한 주소값을 가지는 m_data)를 가진다. 문자열 자체가 주소값을 return 하기에, 같은 주소값을 공유하는데, 내가 { } 안에서 copy가 사라지면서 delete[]을 했다. 그러면 hello..
() 연산자를 오버로딩했다. return 형식을 잘 보면 m_counter += i; 즉 m_counter에 값을 더하고 m_counter을 return 하고 있다. 현재 printInt함수의 인자는 int형이다. 그런데 cents는 엄연히 Cents의 객체이기에 형이 맞지 않다. 하지만 우리의 의도는 cents는 int m_cents 하나 이거 보내고 싶은건데 방법이 없을까? 방법은 생각보다 심플하다. 즉, 내가 객체를 int형으로 casting하면 되잖아. 하지만 그렇다고 무작정 int(cents)해선 안되겠지. cents안에는 m_cents 말고도 수많은 함수들과 멤버들이 있을 수 있으니 우리가 따로 그 기능을 하는 함수를 만들어줘야한다. 지금 같은 경우 operator int()으로 int형으로 ..