|
클래스에서 private 영역에 선언된 것들은 해당 인스턴스 또는 friend (함수,클래스)가 아니면 액세스 할 수 없습니다.
지금 C 클래스를 보면 복제 생성자인 C(C&);가 private 영역에 선언되어 있습니다.
그리고 함수호출 시 C 클래스의 객체를 값에 의한 전달을 하게 되면 위의 복제 생성자가 호출되어
스택에 임시 객체를 만들고 그 것을 호출되는 함수에서 이용하게 됩니다.
그런데 문제는 그게 private 영역에 있는 것이므로 액세스할 수 없다는 오류가 발생하는 것입니다.
따라서 값에 의한 전달을 가능하게 하려면 보통은 복제 생성자를 public 영역으로 옮기거나
아예 선언하지 않고 컴파일러가 제공하는 기본 복제생성자를 이용하면 됩니다.
보통의 경우라면 클래스 인스턴스를 값에 의해 전달하도록 함수를 만들지는 않습니다.
참조 또는 포인터로 합니다.
그리고 호출되는 함수쪽에서 해당 클래스 인스턴스의 내용을 수정하지 못하게 하려면 함수 매개 변수선언에 const를 추가하면 됩니다.
권기식.별사랑 님이 쓰신 글 :
: 안녕하세요?
: 학교에서 고급프로그래밍이라는 수업을 듣고 있는데요..
: 책에 보니 이런 내용이 있네요..
:
: 소제목은
:
: 클래스 객체에서 값에 의한 전달과 반환을 금지
:
: 소스는 다음과 같습니다.
:
: class C {
: public:
: C();
: private:
: C(C&);
: };
: void f(C); // 값에 의한 호출
: C g(); // 값에 의한 반환
:
: int main()
: {
: C c1, c2;
: f(c1); // Error : C(C&)가 private임
: c2 = g() // Error : C(C&)가 private임
: ...
: }
:
: void f(C cObj) {/****/}
: c g() {/****/}
:
: 실제로 해보니 같은 에러가 나네요..
: 도대체 이유를 모르겠습니다.
: 교수님도 에러가 없는 것 같다면서 못 본걸로 하고 넘어가자고 하셨습니다.. ^^;
: 저도 그렇게 대답했구요..
:
: 책의 설명은 C의 복사 생성자 선언이 클래스 선언의 private에 위치한다. 따라서 main에서 f를 호출할 때, c1의 값으로 전달하려 하였으므로 오류가 발생한다.
:
: 클래스를 인자로 쓸 때는 레퍼런스로 넘기나요?
: 이런 말은 본 적이 없는데...
:
: 명쾌한 답변 부탁드리겠습니다...
|