프로그래밍

C++ 이거 책 오류 맞죠?

모던 C++ 디자인 패턴 책에서 프로토 타입에 대한 내용 중 도저히 이해가 안가서 질문올립니다.

먼저 타입은

struct Address

{

 string street, city;

 int suite;

}

 

struct Contact

{

 string name;

 Address *address; 

}

인 상황이고

문제의 내용은

======================================================================

이 경우 복제 생성자를 정의하는데 두 가지 방법이 있다. 금방 떠오르는 방법은 다음과 같이 구현하는 것이다.

Contact(const Contact& other)

: name{other.name}

{

 address = new Address(   //  ------------------------ {1}

   other.address->street,

   other.address->city,

   other.address->suite

  );

}

 

안타깝게도 위 코드는 충분히 범용적이지 않다. - 중략 -

여기에서 상식적인 대응은 Address에 복제 생성자를 정의하는 것이다. 이 예에서는 아래와 같이 쉽게 정의할 수 있다.

 

Address(const string& street, const string& city, const int suite)   // -------------------{2}

: street{street},

city{city},

suite{suite} {}

 

그러면 Conatct의 생성자를 재활용하여 아래와 같이 복제 생성자를 이용하게 할 수 있다.

 

Contact(const Conatct& other)

: name{other.name}

, address{ new Address{*other.address} } {}  // ------------------------{3}

======================================================================

 

위 내용에서

{2}가 복제 생성자(copy constructor 말하는 것 같은데)가 아니라 인수를 받는 생성자고 {3}에서 호출되는게 아니라 {1}에서나 호출되는 코드 아닌가요?

복사생성자면 Address(const Address& other){...}로 정의되어야 하지 않나요

4개의 댓글

바로 밑에 또다른 오류같은데

 

Contact john = worker;

Address에 복제 생성자와 대입 연산자의 구현이 누락되었다고 하자(단 Conatact는 구현되어 있다). 이 코드는 컴파일 되는데 아무런 문제가 없다. 복제 생성자만 사용한다면 상황이 조금 더 낫다. 존재하지 않는 복제 생성자의 호출이 있으면 에러가 발생하여 문제를 인지할 수 있다. 하지만 대입 연산자는 모든 상황에서 디폴트 동작이 정해져 있으므로 적절한 대입 연산자를 정의하지 않았더라도 컴파일되고 실행되어 버린다.

 

???? user-defined 소멸자가 있지 않는 한 복사 생성자도 디폴트가 있고 초기화 시 대입은 대입 연산자가 호출되는게 아니라 복사 생성자잖아요. 제가 알고 있는게 다 잘못된건가요?

0
2024.01.28

크로스 체킹 해보셈

https://refactoring.guru/ko/design-patterns/prototype

0
2024.01.28
@동탄올리버

https://refactoring.guru/ko/design-patterns/prototype/cpp/example

0
2024.01.28

저도 잘 모르지만..

 

책에서 하는 말은

"{1} 방식대로 하면 생성자 매개변수로 하나하나 다 넣어줘야하니 범용적이지 않다! 그러니 {2}처럼 만들고 {3}처럼 쓰면 된다!"

라는거 같은데 뭔가 말이 반대가 된 듯합니다.

 

"{2} 방식대로 만들고 {1} 처럼 쓰면 범용적이지 않다! 그러니 {Address(const Address& other)}처럼 만들고 {3}처럼 쓰면 된다!"가 맞지 않나 싶네요.

 

하지만 책 저자분이 이런 실수를 하지는 않았을꺼 같으니... 내가 틀리지 않았을까! 싶네요

0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
5689 [프로그래밍] 엥 구글 플러터 유기각 재는거임?? 4 최수연 0 1 일 전 238
5688 [프로그래밍] 반도체 장비 업계인 있음? 9 캡틴띠모 0 2 일 전 226
5687 [프로그래밍] 안드로이드 책 추천좀 6 집에가게해줘 0 2 일 전 137
5686 [프로그래밍] 폰 스크리닝 해 본 사람 있어? 3 무지개빛푸딩 0 3 일 전 361
5685 [프로그래밍] jsp 트리메뉴 만들고있는데 구상한게가능한지 의견좀물어볼께 11 평택국 0 3 일 전 144
5684 [프로그래밍] JPA 도와줘어억 ㅠ 10 모그리또 0 4 일 전 227
5683 [프로그래밍] 의사는 뽑는 인원 제한하는데 부캠은 왜 제한 안 할까 5 조강현 0 6 일 전 353
5682 [프로그래밍] 그 혹시 게임쪽 종사자 있음? 17 god79ii 0 9 일 전 617
5681 [프로그래밍] 코린이 ㅅㅂ 뭐가 문젠지 모르겠어요 9 집에가게해줘 0 10 일 전 436
5680 [프로그래밍] Dear Imgui 라고 아시나요? 2 년째모쏠 0 10 일 전 241
5679 [프로그래밍] 현업개발자분들 주말엔 편하게 쉴수있나요? 10 키로 0 11 일 전 847
5678 [프로그래밍] 무엇이든 물어보세요. 28 변현제 0 13 일 전 405
5677 [프로그래밍] 개발자보단 엔지니어가 취업이 잘됨 5 iillillill 2 14 일 전 718
5676 [프로그래밍] 프론트엔드 개발자 연봉 1억 넘는 사람 있어? 13 잠적자 0 14 일 전 623
5675 [프로그래밍] Exiftool 이거 일본어 못 읽는데 13 부터시작하는이세... 0 16 일 전 233
5674 [프로그래밍] 반응형 웹페이지가 내가상상한거랑 좀 다르네 4 평택국 0 16 일 전 445
5673 [프로그래밍] 고졸 FE개발자 연봉, 상황에 조언좀.. 19 쾅꿍꿍 0 17 일 전 598
5672 [프로그래밍] 물경력들 보면 책임을 이해못하는것같음 5 mils 1 18 일 전 409
5671 [프로그래밍] GPT가 코딩 다해주네 3 겜신병자 0 18 일 전 741
5670 [프로그래밍] 크로스플랫폼의 욕심은 끝이없다 4 ye 0 21 일 전 399