西西河

主题:【注意】道歉--刀耕火种的繁荣时代 的连接上次给错了 -- 柚子

全看分页树展 · 主题 跟帖
家园 谢谢回贴

首先谢谢回贴,有讨论才能有进步,沙龙永远胜过一言堂。

>void setValue(const int v){value=v;}

>

>C/C++是Pass-by-value,所以对于简单数据类型的传值,const是不必要的。

>一般在传一个reference或pointer的Input parameter使用const,来避免其内容被函数修改。

这点非常同意,实际上应该是这样的:

TypeResult function(const TypeClass& v){ //pass const reference to avoid temp copy ctor

value=TypeClass(v); //保护性copy,防止v是一个cracker恶意继承自TypeClass的类

}

对于上述setValue,本质希望能够直接对比到ANSI C的实现上,如果涉及保护性copy,和pass by reference

及pass by value,这些language-level的特性,并不是OO的特性,也无法和ANSI C的实现对比了。

>2)Point和Point3D之间不存在继承关系。(而Point和color_point之间存在继承关系)。

>C++的继承关系是严格的IS_A关系,也就是说,Derived class必须拥有base class的所有public和protected属性和 >method。Base class的public virtual function可视作derived class的一个default implementation。(在base >class无法缺省实现时,则常为pure virtual function),显然因为3D的Point多了一个z坐标,彻底改变了2维点的> 物理意义,两者没有这种IS_A关系。严格来说这更像一个Has-A关系。

>虽然数学上两者有紧密联系,而在C++中因为不是严格的IS_A关系,所以不能使用继承。[cchere.com 西西河 无> 斋主人]

>因为多一个Z-坐标,2D point和3D point只能视作两个独立的class,或许实现上3D point class可以composite 2D >point class.

>Scott Meyers在他的Effective C++有一个Item(记不清是具体哪个Item了)是专门解释这一点了。记得他老人家举> 的例子是,矩形和正方形之间不存在继承关系。

关于inheritance和compose,这个也是最近OO中特别强调的一点。例子很多,事实上在某些极端的情况下比如Java, 只有interface可以被implement,而不主张继承任何非抽象类。总之,的确继承在前些年被滥用了,更多的情况下

应该是compose,但是如果你仔细读我的ANSI C代码,就会发现,使用ANSI C实现继承时,只有一个办法——就是 compose,sub struct HAS_A base struct data section。

严格说,按照OO思想,如果采用C++或者JAVA这个继承体系如下:

template<class T>

class point{

public:

virtual const T& getCoordinate(int demension) = 0;

virtual double radius() = 0;

};

tempalte<int n, class T = int>

class pointX: public point<T>{

public:

const T& getCoordinate(int demension){

if(demension < 0 || demension > n)

throw std::runtime_error("out of demension");

return coordinates[n];

}

double radius(){

for(int i=0, res=0; i<n; ++i)

res+=coordinates[i]*coordinates[i]

return sqrt(res);

}

private:

T[n] coordinates;

};

typedef piontX<2> point2D;

typedef pointX<3> point3D;

class colored_point:public point2D{

//...

};

>3)Thread这个例子有个明显问题,

>queue_不是thread safe的,对queue_的操作应要加上Mutex或其他类似的东东加以保护。

这个我觉得你没有理解我的意思,我是在不支持多线程的机器上实现多线程,例如在MS-DOS上,

只有我一个process一个task,哪里有同步的问题呢?

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河