연산자 재정의 함수의 구현 위치에 대하여.

    C++을 가지고 짧막한 실습을 하다가 문득 궁금해졌다.

    연산자 재정의 함수를 클래스의 friend 함수로 선언하고, 도대체 어디서 정의해야할까?

    .h .cpp 로 나뉘어진 클래스 작성에 익숙치않아 기초적인 것에 꽤나 머리를 싸멨다.

     

    알아보자.

     

    문제의 구현 방식. 

    오류를 해결하기 위해, operator << 함수의 구현부를 cpp파일로 옮긴다.

    cpp파일로 구현부를 옮기니 문제없이 정상적으로 컴파일된다.

     

    오류메세지를 읽고 처음에는, include가 중복됐다는 것으로 이해했다. 하지만,  score.h 파일은 이미 ifndef-define-endif 를 통해 중복으로 include되는 것은 막아놨다. 머리가 복잡하다.

    두번쨰론, .h 헤더파일에 클래스 내부에서 friend 함수로 선언한 문장과, 외부에 구현부가 내가 모르는 미상의 이유로 컴파일러에서 중첩되는건가 싶었다. 그런데, 아무리 생각해도 함수의 선언과 구현을 나눈 것일 뿐, 그럴 수는 없을 것 같다.

     

    클래스 분리에 대한 지식이 부족하다 보니, 굉장히 어렵고 미련하게 생각하고 있었는데 생각보다 답은 간단했다.

    마이크로소프에 따르면 .h 파일에서 함수의 정의는 inline 함수만이 가능하다고 한다. 따라서, 연산자 재정의와 같이 필수적으로 클래스 선언 외부에서 함수를 정의해야 하는 경우, friend 선언만 .h 헤더파일의 클래스 내부에서 하고 구현은 .cpp 파일에서 해줘야 한다.

    https://learn.microsoft.com/ko-kr/cpp/error-messages/tool-errors/linker-tools-error-lnk2005?f1url=%3FappId%3DDev16IDEF1%26l%3DKO-KR%26k%3Dk(LNK2005)%26rd%3Dtrue&view=msvc-170 

     

    링커 도구 오류 LNK2005

    자세한 정보: 링커 도구 오류 LNK2005

    learn.microsoft.com

     

    또한 이와 관련되어 찾아보다 도움된 글이 있어 같이 남긴다.

    https://velog.io/@abrahamkim98/C-%EB%AC%B8%EB%B2%95%EA%B8%B0%EB%B2%95-2.-%ED%97%A4%EB%8D%94%ED%8C%8C%EC%9D%BC%EA%B3%BC-%EA%B5%AC%ED%98%84%ED%8C%8C%EC%9D%BC

    '강의요약 > [C++]' 카테고리의 다른 글

    Template 과 Generic 그리고 C++ STL  (0) 2022.11.23
    [C++] 파일 입출력  (0) 2022.11.14
    [C++] 입출력 시스템  (0) 2022.11.14
    (수정필요)[C++] 가상함수와 추상클래스  (0) 2022.11.07

    댓글