문제

이것은 초보자 질문 일지 모르지만, 내가 가진 책을 검사하여 알아낼 수는 없습니다. 클래스의 생성자는 두 개의 복식을 초기화하며 다음 코드가 <<로 두 개의 복식을 출력하려고합니다.

Complex x( 3.3, 1.1 );

cout << "x: " << x;

그 후 나는 이것들에 두 개의 복식을 받아들이려면 >> 과부하가 필요하다. 이것은 여기서 첫 번째 질문이므로 제공된 정보가 부족한 경우 정보를 제공합니다.

편집 : 이제 생성자 및 과부하 문장을 갖추고 있습니다.

#include "Complex.h"

Complex::Complex( double realPart, double imaginaryPart )
: real( realPart ),
imaginary( imaginaryPart )
{

}

std::istream& operator>>(std::istream& strm, const Complex &c)
{
   double r,i;
   strm >> r >> i;
   c = Complex(r,i);
   return strm;
}

나는 "const complex & c"와 "c = complex (r, i)를 변경해야한다는 것을 알고 있습니다. 하지만 어떻게 해야할지 잘 모르겠습니다. 또한 여기서는 이것이 STD 라이브러리의 복잡한 클래스에 관한 것이 아니지만 동일한 아이디어를 기반으로한다고 말할 것입니다. 지금까지 모든 사람들은 큰 도움이되었지만 오늘은 멍청한 사례가 있습니다.

도움이 되었습니까?

해결책

연산자 << :

std::cout 이다 std::ostream 객체, 그래서 당신은 과부하해야합니다 operator<< ~을 위한 ostream, 그것은 가져갑니다 std::complex<double> 당신이 사용한다고 가정하면 논쟁으로 std::complex<double> 표준 헤더 단지에서. 표준 컨테이너 및 클래스를 내부 변경해서는 안되므로 독립형으로 만드십시오.

#include <iostream>
#include <complex>

std::ostream& operator<<(std::ostream& strm, const std::complex<double>& c)
{
    strm << "real: " << c.real() << "imag: " << c.imag();
    return strm;
}

연산자 >> :

operator>> a std::istream 객체는 무엇과 반대입니다 std::ostream 하다. 이와 같은 직렬화를 위해 스트림을 사용하는 경우 예외도 가능하게하는 것이 좋습니다. 보통 당신은 단지 던지고 싶어합니다 std::ios::badbit.

#include <iostream>
#include <complex>

std::istream& operator>>(std::istream& strm, std::complex<double>& c)
{
    double r,i;
    strm >> r >> i;
    c = std::complex<double>(r,i);
    return strm;
}

수업의 내부 구성원에게 액세스 해야하는 경우 과부하 된 기능을 친구로 정의합니다. 그러나 std :: complex :: real ()와 std :: complex :: imag ()는 공개 인터페이스의 일부이므로 여기서는 필요하지 않습니다. 그리고 istream 예를 위해, 우리는 단순히 공개 인터페이스의 일부인 카피 구성자를 호출합니다.

나는 당신이 Cin과 Cout을 여기서 사용하고 싶다고 생각했습니다. 그러나 다른 것에 대해 연산자에게 과부하를주고 싶다면 동일하게 적용됩니다. 클래스 정의 내에서 연산자를 구현하면 this 포인터이므로 연산자 함수는 하나의 인수 만 가져와야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top