看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Visual C++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) no 問題(Question): 顯少以 C++ 開發, 雖瀏覽過一些書 < 看愈多讓人愈模糊 orz > , 有一些問題在設計模式上想請教各位。 小弟發問習慣為所有問題放在同一篇 < 以維護版面清潔 >, 若對於任何一議題有所見解或意見,請不吝指導,非常感激。 Q1 class with function pointer 一種方式是在 C1 裡面塞外部的 function pointer class C1{ private: double (*fptr)(double) ; public : C1 ( double (*fptr_)(double) ) : fptr (fptr_) {} double run(double low, double up) { fptr(low); .... fptr(up); } }; 這種方法好處是可以多弄一個 setter , 隨時改掉 fptr 指向函式 < 又是一個問題,我不知道這種 class 大多從頭到尾指向一個 function,  還是可以中途切到其他的 function 去 ... >   另一種方式以 pure virtual function , 便必需強制繼承撰之 class Base { prvate : virtual double fitness(double) = 0; public : double run(double low, double up) { fitness(low), ..., fitness(up); } } 另外,好奇有沒有像這種東西 < 我知道它是錯的 orz > class C <typename Func> { public : double run(double low, double up) { Func(low), ... , Func(up) ; } }; 請問一般在設計時會怎做 ? Q2 我真搞不懂 template 該什麼時候拿出來用.. 有些 template function 確實是很直覺有個設計之範本,如 template <typename T> T MaxVal(T* beg, T* end); template <typename T> T Sum(T* beg, T* end); 納悶的是一些明明很特別的數值計算上,比方說算平均值好了 這個很明顯最後傳回的會是 double,還有必要做成 template 嗎? template <typename Tin , typename Tout> Tout Average(Tin* beg, Tin* end); < 其實我更納悶的是, std::complex 做成 template 有必要嗎 ? > < 一般在做的時候不都是直接塞 double 進去就好了 ? > Q3 <牛角一> : operator == 是單元運算子,但有時候... 在判斷是否相等之情況下 class C { private : double num; public : bool operator == (const C& other, const double eps=1E-9) const { return fabs (num - other.num ) <= eps; } }; compiler error, 不意外。目前想到折衷的做法是 新增一個 static data member, const static double eps , 但其初值便只能用 coder 自定吧 ? 若使用之 eps 不同時就不能用 == , 必須再額外寫一個 bool C::IsEqu(const C& other, const double eps = 1E-9) const; 還是這部份根本沒人在鳥 floating error ? Q4 <牛角二> : overload subscript of subscript operator... 簡單的說是這個東西 template <typename T> class M{ public: T operator [][] (const size_t row, const size_t col) ; }; 請問,唯一方法是否只能架構起類似 vector<> 的東西,再用繼承方式處理嗎 ? ( 這裡也是一個問題 , 我認為用 "包含" 較佳 , 但一些設計是用繼承處理 ) 這裡我沒打算用 std::vector 原因是認為對 Matrix 而言, col / row 一旦固定幾乎不會變, 用 vector 在效能與空間管理上「主觀」認為並不吃香, 不知我的想法是否有誤 ? PS : 我是有想過用這種方式去做 template <typename T, const size_t row, const size_t col> class M { T arr[row][col]; }; 一樣產生兩個問題 , 這種方式應是放在 stack, 可使用量較小, 另一問題又回到 operator [][] 方面, 目前想過可以用 T operator( const size_t row, const size_t col) ; 方式做 < 但總覺得寫起來很不順 > Q5 <牛角三> : 防呆問題 1. 到底是誰該負責準確性 ? // < part 1 > double div(double a, double b) { return a/b; } double a, b, c; if(fabs(b) > eps) c = div(a,b) ; else /* error handle */ // < part 2 > double div(double a, double b) { assert(fabs(b)>eps) return a/b; } double a, b, c c = div(a,b); 一般而言是弄得像 part1 還是 part 2 ? 或 , 這是公司內互踢皮球的開始 ? 2. 記憶體不夠到底要不要處理 ? 一般抓到什麼除零錯誤、字串格式不對 都還有可議空間 , 把有問題的那段抓出來分析還有機會改善。 但判定 allocate memory fail 時 new fail. malloc fail. 有不同方式可 catch , 除了 log 紀錄起來、程式強制退出,還有其他處理方式嗎? ------------------------------- 小弟學不專精,問題有些多,煩請不吝賜教。 謝謝各位。 -- 「自從我學了 C# , 人都變聰明 , 考試都考一百分」 「自從我學了 VB , 皮膚都變好 , 人也變漂亮了 」 「自從我學了 Java , 明顯變壯 , 個子也變高了 」 「自從我學了 C++ , 內分泌失調 , 頭都禿了... 」 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.76.161
james732:第二個問題,有幾本C++的書深入討論template,而且很恐怖 06/01 18:39
james732:Modern C++ Design(C++設計新思維)可以一看 06/01 18:41
EdisonX:看來似乎是大哉問,謝謝james大提供的線索。 06/01 18:47
loveme00835:the initializer list is in wrong syntax :( 06/01 18:57
EdisonX:真的寫錯了, 謝謝指正。 06/01 19:02
※ 編輯: EdisonX 來自: 180.177.76.161 (06/01 19:12)
purpose:瀏覽器開新分頁時,如果記憶體不夠不能 new,只會盡量維持 06/01 19:33
purpose:原本狀態,等系統變正常看有沒有機會繼續剛才的動作 06/01 19:34
loveme00835:Q2 simple example http://ideone.com/Aapnx 06/01 19:35
loveme00835:Q1 http://ideone.com/6CdZr 06/01 19:57
loveme00835:Q3 http://ideone.com/0y0UT 06/01 20:33
EdisonX:purpose 大說的情況我真沒想到過, 謝謝提點。 06/01 20:50
EdisonX:love~ 大太有心了, 這三個範例讓我查了一陣子用法, 感謝. 06/01 20:51
EdisonX:送出一點 500 * 4 p 幣, 不成敬意, 請笑納。 06/01 20:52
diabloevagto:l大出品,品質保證! 06/01 21:43