컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자!
사본이 나오면 안되는 클래스가 있다.
class Player{ .. }
Player p1;
Player p2;
p1 = p2;
Player p3(p1);
하지만 컴파일러가 만들어낸 함수
기본 복사 생성자, 기본 복사 대입연산자에 의해
사본이 만들어지는 것이 가능하다.
=================================해결책
class Player {
private:
Player(const Player&);
Player& operator=(const Player&);
}
첫번째 방법. 복사 생성자, 복사 대입연산자를 선언해준다.
(명시적으로 선언이 되었기 때문에 컴파일러는 기본 함수를 만들지않는다.)
또한 접근 지정이 private로 되어 있어 외부 호출을 할 수도 없다.
그리고 정의를 아예 해주지 않는다면 혹시나 모를
friend 선언에 의해 호출이 되더라도 링크 시점에서 에러가 뜬다.
즉, private도 선언하고 정의를 해주지 말자는 것이다.
![]()
두번째 방법. 복사 방지를 막는 Base 클래스를 만들자.
class uncopyable{
private:
uncopyable(const uncopyable&);
uncopyable& operator=(const uncopyable&);
}
class Player : private uncopyable { ... }
컴파일러가 생성한 복사 함수는 Base 클래스의 대응 버전을 호출하게 되어있다.
하지만 base 클래스의 복사 함수는 private으로 선언되어있다. (호출 안됨)
또한 링크시점 에러에서 컴파일 시점 에러로 변경된다 (에러를 미리 알 수 있다.)
'C++ 심화' 카테고리의 다른 글
| [C++] 소멸자와 예외처리 (0) | 2016.12.19 |
|---|---|
| [C++] 가상(virtual) 소멸자 (0) | 2016.12.18 |
| [C++] 생성자, 소멸자, 대입 연산자에 주의를 기울이자. (0) | 2016.12.15 |
| [C++] 객체의 초기화 (0) | 2016.12.15 |
| [C++] const의 활용 (0) | 2016.12.15 |