컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자!



사본이 나오면 안되는 클래스가 있다.

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

+ Recent posts