2017-09-20 4 views
-2

C++에 대한 자습서를 작성하여 솔직하게 말해서 정말 훌륭하고 강력한 언어이기 때문에 실제로 그 핵심을 파헤 웁니다. 나는 아직도 상당히 새롭고 ostream 연산자에 대한 연산자 오버로딩 문제가 있습니다.C++ Ostream Operator 오버로드 - 빌드 할 때 정의되지 않은 참조가 누락되었습니다.

이 튜토리얼은 혼동을 피하기 위해 가능한 한 체계적이고 모듈 식으로 코드를 유지하려고합니다. - 연습을 실행

  • MAIN.CPP : 내 코드에 3 개 개의 층이 있습니다.
  • Exercises.cpp/Exercises.h - 연습용 정적 함수가 포함되어 있습니다.
  • ComplexNumber.cpp/ComplexNumber.h - 튜토리얼에 따라 복소수 객체를 나타냅니다.

메인은 매우 간단합니다 : Exercises :: ExerciseName()에 대한 호출 집합.

Exercises.cpp :

#include "Exercises.h" 
void Exercises::ComplexNumberClass() { 
    ComplexNumber c; /** Runs the blank constructor */ 
    ComplexNumber c1(2, 3); /** Runs the args-filled constructor */ 
    ComplexNumber c2 = c1; /** Runs the copy constructor */ 

    c = c2; 

    cout << c1 << endl; 
} 

헤더 파일 만 공용 정적 무효 기능, 즉 호출하고 실행하는 기능 등의 헤더를 갖는다.

ComplexNumber.cpp을 (생성자와 접근없이) :

#include "ComplexNumber.h" 

using namespace ComplexNumbers; 
using namespace std; 

ostream& operator<< (ostream& out, ComplexNumber& num){ 
    out << "(" << num.GetReal() << ", " << num.GetImaginary() << ")"; 
    return out; 
} 

const ComplexNumber &ComplexNumber::operator=(const ComplexNumber &num) { 
    cout << "Using assignment operator override" << endl; 

    real = num.real; 
    imaginary = num.imaginary; 

    return *this; 
} 

ComplexNumber.h :

#ifndef OPERATOROVERLOADING_COMPLEXNUMBER_H 
#define OPERATOROVERLOADING_COMPLEXNUMBER_H 

#include <iostream> 

using namespace std; 

namespace ComplexNumbers { 
    class ComplexNumber { 
    private: 
     double real; 
     double imaginary; 

    public: 
     ComplexNumber(); 

     ComplexNumber(double real, double imaginary); 

     ComplexNumber(const ComplexNumber &num); 

     const ComplexNumber &operator=(const ComplexNumber &num); 

     double GetReal() const { 
      return real; 
     } 

     double GetImaginary() const { 
      return imaginary; 
     } 
    }; 

    ostream &operator<<(ostream& out, ComplexNumber& num); 
} 

#endif //OPERATOROVERLOADING_COMPLEXNUMBER_H 
나는 (내가 틀렸다면 수정하시기 바랍니다) 문제가 생각하는 곳 ComplexNumber 객체 파일은 나는이를 빌드 할 때

, 그것은 '(:: ComplexNumber 객체 &을 cave_of_programming, 표준 : : ostream에 &) cave_of_programming :: 연산자 < <'난에 "정의되지 않은 참조가 내게 말하고있다. 방법 헤더가 일치하고 Jetbrains Clion으로 구축하고 있습니다.

내 연구에 따르면 문제가 링커에 있음을 알았지 만 CMakeLists.txt를보고 해당 파일을 모두 연결하는 것으로 나타났습니다.

SOURCE_FILES main.cpp Exercises.cpp Exercises.h ComplexNumbers/ComplexNumber.cpp ComplexNumbers/ComplexNumber.h 

아무도 왜 이것이 작동하지 않는지에 대한 아이디어가 있습니까? 내가 뭘 놓치고 있니?

답변

2

문제는 ostream &operator<<(ostream& out, ComplexNumber& num)을 클래스 내부에 정의한 것입니다. 이것은 ostream 객체와 어떤 유형의 클래스 인 을 얻었을 때 operator<<을 오버라이드한다는 것을 알고 있기 때문에 컴파일러에게는별로 이해가되지 않습니다. 그러나 구현 한 방법에 따라 ostream, ComplexNumber 및 Another ComplexNumber를 다음과 같이 얻습니다. '이'참조.

클래스 내부의 연산자를 정의하고 그것을 매개 변수

class ComplexNumber 
{ 
    ... 
    ostream &operator<<(ostream& out) const; 
}; 

으로 만 ostream에 제공 또는 클래스 외부 연산자를 정의

제대로 이진 연산자를 오버로드하기 위해

두 가지 옵션이 있습니다

class ComplexNumber 
{ 
    ... 
}; 

ostream &operator<<(ostream& out, const ComplexNumber& num); 

두 번째 구현시 원하는 경우 클래스의 친구로 함수를 추가해야합니다. 모든 비공개 멤버에 액세스 할 수 있습니다.

예를 들어서 여기에 const를 사용하는 것이 좋습니다. 그렇지 않으면 const ComplexNumbers에 연산자를 사용할 수 없습니다.