일지
-
JUNGOL...187일지 2022. 6. 6. 14:12
Intermediate_Coder/그래프탐색-BFS/저글링 방사능 오염 문제 승훈이는 심심한 시간에 스타크래프트(Starcraft) 게임을 하며 놀고 있었다. 스타크래프트 유닛중 하나인 저글링을 한 곳에 몰아세운 뒤, 방사능 오염 공격으로 없애보려고 했다. 그런데 좀 더 재미있게 게임을 하기 위해서 게임을 개조하여 방사능 오염 공격을 가하면 방사능은 1초마다 이웃한 저글링에 오염된다. 그리고 방사능에 오염된 저글링은 3초 후에 죽게 된다. 예를 들어 아래 왼쪽그림과 같이 모여 있는 저글링 중에 빨간 동그라미 표시를 한 저글링에게 방사능 오염공격을 가하면, 총 9초 후에 저글링들이 죽게 된다. 아래 오른쪽에 있는 그림의 숫자들은 각 저글링들이 죽는 시간이다. 저글링을 모아놓은 지도의 크기와 지도상에 저글링..
-
JUNGOL...186일지 2022. 6. 5. 13:35
Intermediate_Coder/그래프탐색-BFS/저글링 방사능 오염 문제 승훈이는 심심한 시간에 스타크래프트(Starcraft) 게임을 하며 놀고 있었다. 스타크래프트 유닛중 하나인 저글링을 한 곳에 몰아세운 뒤, 방사능 오염 공격으로 없애보려고 했다. 그런데 좀 더 재미있게 게임을 하기 위해서 게임을 개조하여 방사능 오염 공격을 가하면 방사능은 1초마다 이웃한 저글링에 오염된다. 그리고 방사능에 오염된 저글링은 3초 후에 죽게 된다. 예를 들어 아래 왼쪽그림과 같이 모여 있는 저글링 중에 빨간 동그라미 표시를 한 저글링에게 방사능 오염공격을 가하면, 총 9초 후에 저글링들이 죽게 된다. 아래 오른쪽에 있는 그림의 숫자들은 각 저글링들이 죽는 시간이다. 저글링을 모아놓은 지도의 크기와 지도상에 저글링..
-
Effective C++...6일지 2022. 6. 4. 08:41
다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자 기본 클래스의 소멸자가 가상 소멸자가 아닐 때의 문제 파생 클래스 객체가 삭제될 때 기본 클래스에 비가상 소멸자가 들어 있으면 파생 클래스의 소멸자가 호출되지 않는다. 즉, 기본 클래스가 가상 소멸자가 아닌 경우 파생 클래스가 정상적으로 제거되지 않는다. ※ 가상 함수를 하나라도 가진다면 소멸자를 가상 소멸자로 선언해야 한다. 모든 클래스에 가상 소멸자를 넣는 것은 다른 문제 가상 함수가 하나라도 있다면 vptr이라는 가상 함수 포인터가 생성되어 클래스의 크기가 커지게 된다. // 비가상 소멸자를 가진 Point 클래스, 크기는 64bit class Point { public: Point(int xCoord, int yCoord); ..
-
Effective C++...5일지 2022. 6. 3. 16:03
컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자 private으로 선언 후 정의를 하지 않는 방법 복사 생성자와 복사 대입 연산자를 private 내부에서 선언하면 컴파일러가 자동 생성하지 않는다. 또, friend를 통해 사용하고자 하더라도 정의가 되어 있지 않으므로 링크 에러가 발생한다. class HomeForSale { public: ... private: ... HomeForSale(const HomeForSale&); HomeForSale& operator=(const HomeForSale&); } 링크 에러를 컴파일 시점 에러로 옮기기 복사를 방지하는 상위 클래스를 만들어 상속받으면 friend에서도 복사 관련 함수에 접근할 수 없게 되어 링크 에러 대신 컴파일 에러..
-
Effective C++...4일지 2022. 6. 2. 13:56
C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 기본적으로 생성되는 멤버 함수 개발자가 따로 생성하지 않으면 컴파일러에서 기본적인 모양으로 만드는 멤버 함수들이 존재한다. 생성자 인자가 없는 기본 생성자를 생성한다. 소멸자 아무 기능 없는 소멸자를 생성한다. 복사 생성자 복사가 가능한 경우 복사 생성자를 생성한다. 멤버가 참조형이거나 상수인 경우 복사가 불가능하다. 복사 대입 연산자 기본 클래스에서 복사 대입 연산자를 private으로 하지 않은 경우 복사 대입 연산자를 생성한다. ※ 복사 생성자와 복사 대입 연산자의 경우 생성이 불가능할 경우 컴파일 에러가 발생한다. 더보기 참고문헌 스콧 마이어스.(2015.03.26).이펙티브 C++
-
Effective C++...3일지 2022. 5. 31. 07:51
객체 사용 전 초기화 처리 객체 사용 전에는 항상 초기화 처리를 해 줘야 한다. C++에서 사용하는 C 부분은 객체를 초기화해준다는 보장이 없다. 어떤 게 초기화를 보장하고 어떤 게 그렇지 않은지 모두 외울 수 없으므로 항상 초기화를 해 줘야 한다. 멤버 초기화 리스트 사용 생성자 내에서 대입을 하는 대신 멤버 초기화 리스트로 초기화를 해주는 게 좋다. ABEntry::ABEntry(const std::string& name, const std::string& address) { theName = name; theAddress = address; // 이건 초기화가 아니라 대입이다. } ABEntry::ABEntry(const std::string& name, const std::string& addre..
-
Effective C++...2일지 2022. 5. 30. 08:51
포인터의 상수 처리 포인터는 const를 어디에 붙이는지에 따라 포인터를 상수 처리할지, 데이터를 상수 처리할지 달라진다. char greeting[] = "Hello"; char* p = greeting; // 비상수 포인터, 비상수 데이터 const char* p = greeting; // 비상수 포인터, 상수 데이터 char* const p = greeting; // 상수 포인터, 비상수 데이터 const char* const p = greeting; // 상수 포인터, 상수 데이터 ※ 값의 수정이 필요한 경우가 아니면 const를 붙여두면 추후 실수를 막을 수 있다. 상수 함수의 오버로딩 클래스의 함수는 상수 여부만으로 오버 로딩이 가능하다. class TextBlock { public: ... ..
-
Effective C++...1일지 2022. 5. 27. 08:09
클래스 범위에 상수 정의 클래스 범위에만 상수를 적용할 때는 정적(static) 멤버로 만드는 게 좋다. 이때, 헤더(.h 파일)에는 선언만 존재해야 하고 정의는 구현(.cpp 파일)에 들어가야 한다. ※ 클래스 컴파일 시 상수 값이 필요한 경우는 예외로 둔다. // CostEstimate.h class CostEstimate { static const double FudgeFactor; } // CostEstimate.cpp const double CostEstimate::FudgeFactor = 1.35; 나열자 둔갑술(enum hack) 클래스 컴파일 시 상수 값이 필요한 경우 상수 대신 enum을 선언하여 사용할 수 있다. ※ enum은 쓸데없는 쓸데없는 메모리 할당이 발생하지 않는다. class..