※ 引述《aixdgxu (qwe)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: VC++
: 問題(Question):
: 各位好,小弟初學C++
: 有一個問題不知道該用怎樣的關鍵字去找到解答,所以到板上一問。
: 我今天有一個物件,裡面有一些讀值、處理的功能
: 我希望能夠在物件產生的時候讀值一次就好
: 但是當我離開宣告物件產生的函式
: 我要怎樣寫才可以在其他函式中直接得到我在main當中產生的物件
: 利用之前讀值的結果作處理,而不用再宣告一次物件多讀值一次
: 底下是程式大綱
: class A { }; //某種物件
: class B //做處理的class
: {
: private:
: vector<A> A[100]; // A的array
: public:
: void Analysis_data()
: { }
: int Get_value()
: {}
: };
: Get_value是要在Analysis_data之後才有意義
: 但我希望只要在main呼叫一次就好
: 那在程式某個深處我該如何Get_value
抽象化阿, 太早跳進來寫程式了
一開始你有"讀進來的數值, 未處理的資料", 所以先定義一個類別:
struct RawData {};
再來你要對這些未處理的資料做一些分析, 所以也要有人去做:
struct DataAnalyzer {};
分析完會有已經整理好的資料:
struct ProcessedData {};
RawData 若要達成不重複讀值, 就需要有做儲存的機制. 假設它是
一連串的整數數值存在檔案裡, 那麼使用上就是:
RawData raw_data("integer-values.txt");
對這些資料可以多次存取, 就看你介面怎麼設計, 不過既然有儲存
機制也表示不好用call by value的方式當參數傳給 DataAnalyzer
DataAnalyzer analyzer;
analyzer.analyze( raw_data ); // 分析第一次
analyzer.analyze( raw_data ); // 分析第二次
處理完的資料要想辦法接起來, 假如也是巨量的資料, 那麼就直接
new 一個新實體:
ProcessedData *new_data = analyzer.analyze( raw_data );
再來就是你 new_data 要怎麼給人家用裡頭的資料了( 記得最後要
delete掉就是) 這三個部分若設計得好往後還可以變成框架讓後輩
叫用.
你本來的設計有兩大缺陷:
(1) 如果 A 是代表資料的類別, 那麼既然 B 擁有 A,
B 在某種意義上來說也是資料, 要一個資料處理
它自己本身是不合理的
(2) "你要呼叫 D 之前一定要先呼叫 C 喔", 有這樣的
情形表示在 D 的定義裡就要自己呼叫 C 而不是把
C 變成介面然後丟給使用者去傷腦筋, 而且文件上
也因此會多寫沒必要的敘述
把問題寫在code裡, 不要做任何轉譯的動作, 善待未來要維護的人
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115