프로그래밍

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
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
5709 [프로그래밍] 패스트 캠퍼스 <---- 얘내는 가격 인상 원툴임? 5 조강현 0 1 일 전 256
5708 [프로그래밍] 클라가 파이썬 셀레니움같은거 써서 클릭하고 그러는걸 감지 ... 5 리옴므 0 3 일 전 193
5707 [프로그래밍] leetcode 50일 달성 1 JimmyMcGill 1 3 일 전 165
5706 [프로그래밍] 그냥 개인공부용 git 만들건데 5 년째재수강 0 3 일 전 253
5705 [프로그래밍] html 자바스크립트 질문 19 책걸이 0 3 일 전 298
5704 [프로그래밍] 아니 시바 이게 무슨일이야 4 인간지표 0 4 일 전 314
5703 [프로그래밍] 아두이노 키트 아무것도 모르고 사도 될까? 6 그것 0 4 일 전 258
5702 [프로그래밍] 횽들 Vimeo에 올라가있는 동영상의 원본크기를 확인할 수 있... 13 카뜨만두 0 5 일 전 185
5701 [프로그래밍] c# 이벤트와 델리게이트 13 RX7900XTX 0 7 일 전 304
5700 [프로그래밍] Aws 람다에 파이썬 올려서 결과 받아오는데 11 아르피쥐 0 9 일 전 343
5699 [프로그래밍] 마리아DB mediumtext 그냥 쓰고 싶은데 21 잉텔 0 10 일 전 220
5698 [프로그래밍] 안드로이드 씹뉴비 질문이요 2 집에가게해줘 0 10 일 전 125
5697 [프로그래밍] c언어 7년했는데 이런게 되는거 처음알았음.. 4 케로로중사 0 11 일 전 891
5696 [프로그래밍] 파이썬 1도 모르는데 GPT로 프로그램 뚝딱 만듬 2 푸르딩딩 1 14 일 전 743
5695 [프로그래밍] 담주 면접잡혔는데 8 삐라루꾸 0 14 일 전 503
5694 [프로그래밍] 아두이노 부트로더를 구웠는데.. 4 렙이말한다ㅡ니가옳다 0 15 일 전 233
5693 [프로그래밍] IOS 개발자 있나여? 1 g4eng 0 17 일 전 260
5692 [프로그래밍] 시스템 디자인 인터뷰 준비 도움좀!!! 1 Nognhyup 0 18 일 전 202
5691 [프로그래밍] 최근에 vscode 쓴 사람 도움! 3 172102 0 19 일 전 524
5690 [프로그래밍] 책을 또 사버리고 말았다... 1 찰나생멸 2 19 일 전 524