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



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

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

소시지 공장 알고리즘을 풀어보자.




단순하기 짝이없다.

1. 길이가 긴 순으로 줄을 세우고, 넓이에서 시간 소요가 발생하는 부분을 카운트

2. 넓이가 넓은 순으로 줄을 세우고, 길이에서 시간 소요가 발생하는 부분을 카운트

3. 가장 짧은 시간대를 출력.




알고리즘이라 하기에 민망한 수준의 풀이다.

또한 위의 코드는 제대로 동작하지 않는다. 

다음 포스팅에 무엇이 잘못 되었는지 분석해보고

제대로 된 풀이를 올리도록 하겠다.


알고리즘을 풀 때마다 느끼는거지만 내 뇌는 알고리즘적 사고에 아예 진화가 안된거 같다.

지금은 형편없이 풀었지만 점점 배워나가면서 좀 더 우아하고 멋진 풀이를 선보이겠다.



C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자.



생성자

새로운 객체를 메모리에 만드는 데 필요한 과정을

제어하고 객체의 초기화를 맡는 함수


소멸자

객체를 없앰과 동시에 그 객체가 메모리에서

적절히 사라질 수 있도록 하는 과정을 제어하는 함수


대입 연산자

기존의 객체에 다른 객체의 값을 줄 때 사용하는 함수


컴파일러가 저절로 선언해 주도록 되어 있는 것들

생성자, 복사 생성자, 복사 대입 연산자, 소멸자

--> 모두 public, inline

기본적인 내용이기 때문에 예시는 생략한다.



1. C++의 참조자는 원래 자신이 참조하고 있는 것 외에 다른 객체를 참조할 수 없다.

(초기화 시에 이미 참조를 결정한다.)

2. const 또한 참조와 마찬가지로 한번 정해진 값을 바꿀 수 없다.


이러한 부분들이 컴파일러에 의해 만들어지는 기본 대입연산자로

처리하기가 상당히 애매한 부분이 될 수 있다.

--> 자신이 직접 대입 연산자를 정의하여 사용해야 한다.


짚고 넘어가기

대입 연산자를 private로 선언할 경우

이 클래스로부터 파생된 클래스는

기본 대입 연산자를 가질 수 없다.



POINT!!


컴파일러는 기본 생성자, 복사 생성자, 복사 대입 연산자, 소멸자를

암시적(디폴트) 으로 만들어 놓을 수 있다.

+ Recent posts