作者EdisonX (閉上眼的魚)
看板C_and_CPP
標題[問題] 數值分析 class / template 設計模式問題
時間Fri Jun 1 18:35:11 2012
開發平台(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
→ 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