2016-10-15 4 views
1
  1. 많은 변수가있는 생성자를 사용할 때. 먼저 그것을 초기화 한 다음 생성자에게 전달합니다. 이 방법을 사용하면 파일이나 콘솔로만 데이터를 입력 할 수 있습니다.C++ 클래스 생성자 및 istream 연산자 >>

  2. 그러나 istream 연산자를 사용할 때 >>. 기본 생성자를 사용하고 istream 연산자 >> 메서드에 넣습니다. 하지만 난 이런 식으로 기본 생성자 제외한 다른 생성자를 사용할 필요가없는 것으로 나타났습니다 있지만 특성을 파일이나 콘솔에 의해 입력 될 수 있습니다. 예를 들어 :

    class Fraction 
    { 
    private: 
    int numerator; 
    int denominator; 
    public: 
    Fraction(int num,int den); 
    Fraction(); 
    friend istream& operator>>(istream& is,Fraction &frac); 
    }; 
    
    
    void main() 
    { 
    int num,int den; 
    cin>>num>>den; 
    Fraction fra(num,den); 
    } 
    
    
    istream& operator>>(istream& is,Fraction &frac) 
    { 
        is>>frac.numerator>>frac.denominator; 
    return is; 
    } 
    void main() 
    { 
        Fraction f; 
        ifstream inputFile("data.txt"); 
        if(inputFile.file()) 
        { 
        cout<<"File cannot be opened!"<<endl; 
        } 
        inputFile>>f; 
        inputFile.close(); 
    //with input from console 
        cin>>f; 
    } 
    

내 질문에 첫 번째 또는 두 번째를 사용하는 방법을 추천해야합니까?

+0

먼저 코드가 작동해서는 안됩니다. 멤버'operator >>는 멤버 변수가 1 개만 있어야합니다. 비록 당신이 그것을 올바르게 만들지 만 그것이 이상하게 보일 것입니다 :'object >> stream'. 친구 연산자 >>를 만들어 사용하십시오. 'istream &'생성자를 제공하는 것은 조금 과장 될 것이고, 실제로는 자연스럽지 않을 것입니다. – Incomputable

+0

True. 나는 운전자 >> –

답변

0

일반적으로 숫자 값은 기본 생성 및 입력에서 읽습니다. 기본 구성 및 할당에 매우 저렴하기 때문에 숫자 값을 읽어야합니다. 이 경우, 그렇게하고 싶으면 스타일의 문제 일뿐입니다. 그럼에도 불구하고

, 당신은 당신의 코드에서 중요한 버그를 가지고 : 사업자의

istream& operator>>(istream& is,Fraction &frac); 

회원의 과부하를 초래하는 @이 같은처럼 :

istream& operator>>(istream& is); 

출처 : en.cppreference.com.

operator>>이 작성하는 것입니다 오버로드 할 수있는 일반적인 방법 :

friend istream& operator>>(istream& is, Fraction& frac); 

왜 멤버를? 회원이 되려면 다음과 같이 작성하십시오.

object >> stream; 

매우 성가시고 쓸모가 없습니다.

+0

참을 친구를 사용하는 것을 잊었다. 친구를 통해 연산자를 잊어 버렸습니다 >> –

1

사용하기에 안전하고 편리한 코드를 작성하십시오.

Fraction 클래스는 간단하며 다양한 용도로 사용할 수 있으므로 생성자와 직렬화 연산자를 모두 사용하는 것이 좋습니다. 일반적으로 간단하고 일반적인 사용법이 가장 좋습니다.

복잡한 유효성 검사 규칙이있는 많은 속성이나 구조화 된 데이터를 포함하는 클래스의 경우 매개 변수가 많은 생성자 오버런과 혼동 스러울 대안 매개 변수가있는 생성자 오버로드가있는 것은 불편할 수 있으므로 건너 뛰고 수행 할 수 있습니다. 없이. 그러나 그것은 "god class"문제에 증상이되는 프로그램 설계를위한 적기 일 것입니다.

+0

"std :: string"의 인터페이스에 대한 링크를 "god class"의 예제로 추가하여 OP가 "진짜 의미"를 갖도록 할 수 있습니다. – Incomputable

관련 문제