[問題] 數值分析 class / template 設計模式問題
開發平台(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
→
06/01 18:39, , 1F
06/01 18:39, 1F
→
06/01 18:41, , 2F
06/01 18:41, 2F
→
06/01 18:47, , 3F
06/01 18:47, 3F
→
06/01 18:57, , 4F
06/01 18:57, 4F
→
06/01 19:02, , 5F
06/01 19:02, 5F
※ 編輯: EdisonX 來自: 180.177.76.161 (06/01 19:12)
推
06/01 19:33, , 6F
06/01 19:33, 6F
→
06/01 19:34, , 7F
06/01 19:34, 7F
→
06/01 19:35, , 8F
06/01 19:35, 8F
→
06/01 19:57, , 9F
06/01 19:57, 9F
→
06/01 20:33, , 10F
06/01 20:33, 10F
→
06/01 20:50, , 11F
06/01 20:50, 11F
→
06/01 20:51, , 12F
06/01 20:51, 12F
→
06/01 20:52, , 13F
06/01 20:52, 13F
→
06/01 21:43, , 14F
06/01 21:43, 14F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章