呵呵,我很享受这样的讨论。但总感觉我们俩说的是两件事,silent_world强调的是void *在公用模块中的作用,而我所说的是void *在目前讨论的三叉搜索树模型中的隐患。
对于void *指针的一个典型范例就是stdlib.h中的qsort函数。通过使用void *参数可以使qsort函数对任意类型的数组进行排序。
但是对于tstrie_destroy(void *root)函数,root必须是一个TERNARY_TRIE型指针,君的函数也只能处理TERNARY_TRIE树(在函数里也做了显示转换),所以这个void *的好处在这里并没有得到体现。相反由于它掩盖了传入指针的原有类型,函数内部并不能知道它原来是指向什么的指针,一概当作TERNARY_TRIE处理。当由于某种原因传入一个别的类型指针,编译器不会发出警告,这时会引发不可预知的问题。这是我反对在这里使用void * 的重要原因。
君提出的另一个概念倒是很有意思,工厂模式在C语言里的应用。
我的C语言学习和使用的阶段主要是在初中和高中。上大学后学了两年C++,之后.net异军突起就改学C#了,包括现在主要使用的语言是C#,C只在玩ACM和论坛交流时才用。
我对语言的使一直以来用分的很开,面向对象就要用面向对象的思想,面向过程就用面向过程的角度。
不过,现在,有时间我一定看看设计模式在C语言下的应用方法和案例。
最后,指出一点,君的tstrie_delData函数逻辑不对。
呵呵,我说话过于直,这是个缺陷,silent_world请见谅,希望这不要影响你交流的心情
对于void *指针的一个典型范例就是stdlib.h中的qsort函数。通过使用void *参数可以使qsort函数对任意类型的数组进行排序。
但是对于tstrie_destroy(void *root)函数,root必须是一个TERNARY_TRIE型指针,君的函数也只能处理TERNARY_TRIE树(在函数里也做了显示转换),所以这个void *的好处在这里并没有得到体现。相反由于它掩盖了传入指针的原有类型,函数内部并不能知道它原来是指向什么的指针,一概当作TERNARY_TRIE处理。当由于某种原因传入一个别的类型指针,编译器不会发出警告,这时会引发不可预知的问题。这是我反对在这里使用void * 的重要原因。
君提出的另一个概念倒是很有意思,工厂模式在C语言里的应用。
我的C语言学习和使用的阶段主要是在初中和高中。上大学后学了两年C++,之后.net异军突起就改学C#了,包括现在主要使用的语言是C#,C只在玩ACM和论坛交流时才用。
我对语言的使一直以来用分的很开,面向对象就要用面向对象的思想,面向过程就用面向过程的角度。
不过,现在,有时间我一定看看设计模式在C语言下的应用方法和案例。
最后,指出一点,君的tstrie_delData函数逻辑不对。
呵呵,我说话过于直,这是个缺陷,silent_world请见谅,希望这不要影响你交流的心情
重剑无锋,大巧不工