看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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