2017-01-08 15 views
1

C++コースの練習をしましたが、提供されたコードがわかりません。質問です:私たちは、このようなC++:1つの出力操作のフォーマット出力を変更する

Form gen4(4); 

void f(double d){ 
    Form sci8=gen4; 
    sci.scientific().setprecision(8); 
    std::cout << gen4(d) << " back to old options: " 
    << d << std::endl; 
} 

GEN4はに出力パラメータを適用するオペレータいくつかの「のようなもの」となるべき次のコードで示すように出力されるように単一の値のみの書式を変更するとよいでしょうその単一の出力操作だけです。

私は尋ねているかを理解し、私はこのようなカスタムI/Oマニピュレータを定義することができる方法を理解する:

Form gen4(4); 

void f2(double d){ 
    Form sci8=gen4; 
    sci8.scientific().setprecision(8); 
    std::cout << sci8 << d << endl; 
    // from now on, all output will use the format defined by sci8 
    // (until changed again) 
} 

だから私は2つの質問を持っています。

  1. 最初のコードはどうやって分かりますか?彼はgen4のコンストラクタを引数dで2回も呼び出すが、オブジェクトが既に存在するにもかかわらず、どのようにしてコンストラクタを2度目に呼び出すべきか?
  2. 実際に次の操作にしか使用できないカスタムI/Oマニピュレータを実際に作成するにはどうすればよいですか?私にとってはかなり難しいようで、私は何をすべきかわからない。ここでは完全を期すために
+1

'Form'は、フォーマットパラメータとdouble値を格納するいくつかのプロキシクラス(例えば、' FormatDouble')のインスタンスを返す 'operator()(double)'を提供することができます。 'FormatDouble :: operator <<'は、現在のフォーマット設定を保存し、新しいフォーマット設定を行い、double値を出力し、最後に元の設定に戻します。このシナリオでは、 'gen4(d)'は 'gen4.operator()(d)'(コンストラクタではなく、実際には意味をなさない)オーバーロードされた 'operator ')の呼び出しの省略形です。 –

+0

私はそれがオペレータ()かもしれないと思っていましたが、グーグルは()のような特殊文字を取り除くので、そのようなものをグーグルで探すことは困難です。コメントありがとう、あなたがそれを答えるなら、私はそれを受け入れることができます。 – Hakaishin

+0

もう一つのオプションは、 'Form :: operator()(...)'が正しくフォーマットされた値を 'stringstream'に書き出し、対応する' string'を返すことです。これはおそらく@ IgorTandetnikのソリューションほど効率的ではありませんが、一方ではもっと便利かもしれません。 –

答えて

0

はコメントで与えられたアドバイスを使用して私の答えです:

6.49594542e+04 back to old options: 64959.454 

#pragma once 
#include <iostream> 

class Form{ 
public: 
    int prc, wdt, fmt; 
    bool sci = false; 
    Form(int p=6) : prc(p) { 
    fmt=wdt=0; 
    } 
    Form& scientific() { 
    sci = true; 
    return *this; 
    } 
    Form& precision(int p) { 
    prc=p; 
    return *this; 
    } 
    Form& operator()(double d){ 
    std::ios::fmtflags f(std::cout.flags()); 
    if(sci){ 
     std::cout.setf(std::ios_base::scientific); 
     std::cout.precision(prc); 
    } 
    std::cout << d; 
    std::cout.flags(f); 
    return *this; 
    } 
}; 

std::ostream& operator<<(std::ostream& os, const Form& f){ 
    return os; 
} 

form.h main.cppに

#include <iostream> 

#include "include/form.h" 

Form gen4(4); 

void f(double d){ 
    Form sci8=gen4; 
    sci8.scientific().precision(8); 
    std::cout << sci8(d) << " back to old options: " << d << std::endl; 
} 

int main() { 
    // Task1 
    f(64959.454243425); 
    return 0; 
} 

は、期待される結果を与えます

イゴールタンデトニクに感謝

関連する問題