2016-10-15 13 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; 
    } 
    

私の質問は、アプローチ最初の1または第二のいずれかを使用し、推奨されなければならないのですか?

+0

まず、あなたのコードはうまくいかないはずです。メンバ 'operator >>は、1つのパラメータしか持たない。たとえそれを正しくしようとしても奇妙に見えます: 'object >> stream'。友人のオペレータ>>を作って使ってください。 'istream&'コンストラクタを提供するのはちょっと残酷になりますが、実際は自然ではありません。 – Incomputable

+0

Trueです。私はオペレーター>> –

答えて

0

通常、数値は既定で構成され、入力から読み取られます。これは、既定の構成と割り当てに非常に安価であるためです。この場合、そうしたいのであればスタイルの問題に過ぎません。これにもかかわらず

、あなたのコード内の主要なバグがあります。

istream& operator>>(istream& is); 

出典:en.cppreference.com @のような演算子の

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

メンバーのオーバーロードをこのようなものです。

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

なぜメンバー:operator>>がこれを書くことであろうオーバーロードする

通常の方法?もしメンバーになれば、あなたはこれを書いたでしょう:

object >> stream; 

これは非常に面倒で無駄です。

+0

の友人を使って忘れてしまった。私は友人の演算子を使用して忘れてしまった>> –

1

安全で使いやすいコードを記述してください。

Fractionクラスはシンプルであり、多種多様な可能性があるため、コンストラクタとシリアライズ演算子の両方を持つことは妥当です。原則として、シンプルで汎用的なクラスが最適です。

バリデーションルールが複雑な多くのプロパティまたは構造化データを含むクラスの場合、多くのパラメータを持つコンストラクタ(または複雑な選択肢のパラメータを持つコンストラクタオーバーロード)を持つのは不便かもしれないので、スキップしてなし。しかし、それはプログラム設計のための赤い旗であり、 "神クラス"の問題の症状になります。

+0

あなたは 'std :: string'のインターフェースへのリンクを" god class "の例として追加することができます。 – Incomputable