書店プログラムは、重要なポイントのほとんどを含むが、読んで、コードの分散不便、章の順序に従って以下に要約されている「C ++プライマー」の重要な例であります
Sales_item.h
SALESITEM_H #ifndefの // 我々はSALESITEM_Hがまだ定義されていない場合にのみ、ここにいる の#define SALESITEM_H // の#include「Version_test.h」// Sales_itemクラスと関連する関数の定義をここに する#include <iostreamの> の#include < 文字列 > クラスSales_item { // これらの宣言は、セクション7.2.1、pは説明されています。270 // と14章では、ページ557、558、561 友人のstd ::はistream&演算子 >>(STD ::はistream&、Sales_item&); 友達のstd :: ostreamに&演算子 <<(STD :: ostreamに&、constの Sales_item&); 友人のブール 演算子 <(constの Sales_item&、constの Sales_item&); 友人のブール 演算子 ==(constの Sales_item&、constの Sales_item&); 公共: // コンストラクタはセクション7.1.4で説明されている、ページ262から265 // のメンバーを初期化するために必要なデフォルトコンストラクタビルトインタイプ の#if定義された(IN_CLASS_INITS)&&定義された(DEFAULT_FCNS) Sales_item() = デフォルト; #else Sales_item():units_sold(0)、収益(0.0 ){} #endifの Sales_item(CONSTのstd :: 文字列&ブック): bookNo(書籍)、units_sold(0)、収益(0.0 ){} Sales_item(STD ::のIStream&ある){ ある >> * この; } 公共: // Sales_itemの操作は、オブジェクト // 部材バイナリ演算子:暗黙的に結合された左オペランドこのポインタ Sales_item&演算子 + =(CONST Sales_item& )。 //Sales_itemの操作は、オブジェクト のstd :: 文字列 ISBNを()CONST { 戻りbookNoと、} ダブル avg_price()CONST 。 // 前のようにプライベートメンバー のプライベート: のstd :: 文字列 bookNo。 // 暗黙的に空の文字列に初期化さ IN_CLASS_INITS #ifdefの 符号なしunits_sold = 0 ; // 明示的に初期化 、二重収入= 0.0 ; #elseの 符号なしunits_sold。 二重の収入; #endifの }。 // 10章に使用 インライン BOOL compareIsbn(CONST Sales_item&LHS、CONST Sales_item&RHS) { 戻り lhs.isbn()== rhs.isbn()。} // バイナリ演算子非会員:各オペランドのパラメータを宣言する必要があり Sales_item オペレータ +(CONST Sales_item&、CONST Sales_item& )。 インラインブール 演算子 ==(CONST Sales_item&LHS、CONST Sales_item&RHS) { //Sales_itemの友人のなされなければならない リターンを lhs.units_sold == rhs.units_sold && lhs.revenue == rhs.revenue && lhs.isbn() == rhs.isbn(); } インラインブール 演算子!=(CONST Sales_item&LHS、CONST Sales_item&RHS) { リターン(LHS == RHS)!。// != ==オペレータによって定義 } // 両方のオブジェクトが同じISBNを参照することを前提とし Sales_item&Sales_item :: 演算子 + =(CONST Sales_item&RHS) { units_sold+ = rhs.units_sold。 収入 + = rhs.revenue。 返す * これを。 } //は両方のオブジェクトが同じISBNを参照することを前提とし Sales_itemの 演算子(+ CONST Sales_item&LHS、CONST Sales_item&RHS) { Sales_item RET(LHS)。 // 我々が戻りますことをローカルオブジェクトにコピー(| | LHS) ; RET + = RHSを // (| RHS |)の内容に追加 リターン RET; // 戻り値(| RET |)値によって } のstd ::はistream& 演算子>>(STD ::はistream&中、Sales_item&S) { ダブル価格。 中 s.bookNo >> s.units_sold >> 価格。 // 入力が成功したことを確認 場合(中) s.revenue = s.units_sold * 価格。 他の S = Sales_item(); // 入力に失敗しました:デフォルトの状態にリセットオブジェクト のリターン では、 } のstd ::のostream& 演算子 <<(STD ::のostream&アウト、CONST Sales_item&S) { アウト<< s.isbn()<< " " << s.units_sold << " " << s.revenue << " " << s.avg_price()。 返す アウト; } 二重 Sales_item :: avg_price()のconst { 場合(units_sold) 戻り収入/ units_sold。 それ以外 の戻り 0 ; } #endifの
- Sales_itemを含むであろう次のセクションでオペレータのオーバーロードの知識を必要とするクラス、などを定義しました
item_io.cpp
#include <入出力ストリーム> の#include " Sales_item.h " int型のmain() { Sales_item帳; // ISBN、販売部数、および販売価格読み のstd :: cinを>> 本を。 // 書き込みISBN、販売コピー、総収入、平均価格の数 はstd :: coutの<<ブック<< はstd ::てendl; リターン 0 ; }
- Sales_itemオブジェクトに標準入力データから実現し、そのオブジェクトの内容は、標準出力に書き戻します
add_item.cpp
#include <入出力ストリーム> の#include " Sales_item.h " int型のmain() { Sales_item ITEM1、ITEM2。 std :: cinを >> ITEM1 >> ITEM2。 // トランザクションのペアは読み はstd :: coutのを<< ITEM1 ITEM2 + <<はstd ::てendl; // その合計の印刷 リターン 0 ; }
- 2つのオブジェクトを達成するためにSales_itemを追加します
add_item2.cpp
#include <入出力ストリーム> の#include " Sales_item.h " int型のmain() { Sales_item ITEM1、ITEM2。 std :: cinを >> ITEM1 >> ITEM2。 // ITEM1とITEM2が同じ本を表すことを最初のチェック 場合(item1.isbn()== item2.isbn()){ のstd :: COUT << ITEM1 + ITEM2 << のstd :: ENDL。 リターン 0 ; //は成功を示し } 他{ のstd :: CERRが << " データが同じISBNを参照しなければならない" <<std ::てendl; リターン - 1。 // 失敗を示します } }
- Sales_itemは、最初の2つのオブジェクトが同じISBNを持っているかどうかを判断達成し、我々はその後追加します
avg_price.cpp
#include <入出力ストリーム> の#include " Sales_item.h " int型のmain() { Sales_item合計。// // 最初のトランザクションを読み取り、プロセスにデータがあることを確認し た場合(スタンダード:: CIN >> 合計){ Sales_itemトランス。// 実行中の合計保持する変数 //が残っているトランザクションを読み込んで処理 しながら、(STD :: cinを>> トランス){ // 我々はまだ同じ本を処理している場合 ならば(total.isbn()== trans.isbn ()) の合計 + =トランス。//実行中の合計更新 他に{ // 前の本の印刷結果を STD :: coutの<<合計<< はstd ::てendl; 合計 =トランス; // 合計は現在、次の本を指し } } のstd :: coutの <<合計<<はstd ::てendl; // 最後のトランザクション印刷 } 他{ // 入力なしを!ユーザーに警告 のstd :: CERR << " のデータはありません!" << はstd ::てendl; リターン - 1。 //は失敗を示している } の戻り 0 ; }
- 実装ファイルには、各ディスプレイのために販売部数、平均価格を生成し、レコード販売、書籍販売のレポートから読み出され、売上高は(一緒にファイルに保存されている各ISBN ISBNのすべてのレコードを想定)の合計
- ISBNは、すべてのデータは、各変数の合計のために記憶される可変トランスリードによって記憶された各レコードをマージし、同じトランスISBN合計値に合計点が、そうでなければ、総印刷の値、及びリセットそれが更新される場合ただ、トランスを読みます