C++ 에서는 기본적으로 빈 클래스를 생성하면 자동으로 생성해주는 생성자와 소멸자 등 이있다.
예를들어
는
와 같은 기능을 수행한다고 보면 된다.
매번 다 모든 생성자들과 소멸자를 생성 하는것은 아니고, 컴파일러가 필요하다고 판단될때 생성해준다.
아래와 같은 동작을 수행할 때 생성 된다.
자동으로 생성된 것을 사용하여 문제가 없으면 좋겠지만, 문제가 발생하는 경우들이 있다.
대표적으로
1 .참조자를 데이터 멤버로 가지고 있는 경우 2. 상수 객체를 데이터 멤버로 가지는 경우 |
두가지를 꼽을 수 있다.
위와 같은 상황에서는 직접 복사 대입 연산자를 정의해 주어야 한다. 그렇지 않으면 컴파일 오류가 발생하게 된다.
그러면, 복사생성자나 대입연산자를 자동생성하지 않는 방법은 없을까?
사본을 만들지 않고 유일한 객체를 가지고싶은 경우가 생길 수도있다.
이를 해결하기 위한 방법으로 두가지를 소개하려고 한다.
먼저 위코드를 살펴보자.
기존의 복사생성자 및 복사 대입연산자를 선언하는 것과 다른점은 크게 두가지이다.
첫번째는 public이 아닌 private 멤버로 선언을 하는 것과 두번째는 정의부를 구현하지 않는 것이다.
두번째 방법에 대한 보충 설명으로. 정의부를 구현하지 않으면 링크 에러가 발생하게 되는데,
이는 friend 함수나 클래스내 멤버함수에서 복사생성자나 복사대입연산자가 호출되지 않게 하기 위한 방법이다.
물새는 곳 없이 꼼꼼히 막기위한 방법으로 생각하면 될것이다.
첫번째 방법은 그럴듯해 보이지만 두번째 방법은 쿨하다고 생각하지 않을 수 도 있다.
이렇게 방지하는 방법은 C++의 iostream 라이브러리 구현 환경의 몇몇 클래스에서도 복사 방지 책으로 사용중이니
'기법'으로 생각하고 사용 하면 될것 같다.
두번째 방법은 링크 시점 에러발생을 컴파일 타임 시점 에러로 옮길수 있는 방법이다.
첫번째 방법으로 생성했던것과 비슷하게 Uncopyable class를 만들고
그 클래스를 복사방지를 하고싶은 클래스에서 private로 상속 받는 방식으로 사용한다.
이렇게 사용하게 되면, 컴파일러가 생성한 복사 함수는 기본 클래스의 대응 버전을 호출하게 되는데
복사 함수들이 기본 클래스에서 공개되어 있지 않기 때문에 컴파일 에러가 나게 된다.
이렇게 사용하게되면 다중상속의 문제가 발생할 여지가 있지만, 그부분 여기선 고려하지 않겠다.
위방법들 중에서 적당한 방법을 선택하여 사용하면 될것이다.
"이 글은 'Effective C++' 을 읽고 정리한 내용입니다."
'개발 > C++' 카테고리의 다른 글
[MFC] C++ 파일입출력 CFile/CArchive (직렬화. Serialize) (0) | 2021.08.26 |
---|---|
[C++] static 멤버 변수, static 멤버 함수에 대해 (+ mutable) (0) | 2021.08.24 |
안전한 정수 연산을 위해 SafeInt 를 써보자 (0) | 2020.07.13 |
VS 2017 환경에서 glog 설치 및 적용 방법 (0) | 2020.07.09 |
[EC++] #define 대신 const, enum, inline을 사용해야 하는 이유 (0) | 2020.02.11 |
댓글