小妹在看《设计模式》,多年没看C++,很多东西都不太明白。

时间:2021-06-24 10:41:00
小妹在看《设计模式》,多年没看C++,很多东西都不太明白。
比如:
第二章中的拼写检查和断字处理,P49的代码有以下几处
if (c=dynamic_cast<charactor*>(glyph)){
}
c=dynamic_cast<charactor*>(glyph)
dynamic_cast应该是个模板类吧,charactor*是对模板类实例化吧,那(glyph)是什么意思那?

再如:
void Checkme(SpellingChecker&),是什么东东?没见过这样的引用表示啊

又如:
void GlyphSubClass::CheckMe(SpellingChecker&  checker)
SpellingChecker&  checker????
我平时见到的都是这样的(int  &i)没见过这样写的。


郁闷,这里的代码是不是C++啊?我还该看什么书先补补吗?

10 个解决方案

#1


dynamic_cast不是模板,而是类型转换。
dynamic_cast_<charactor*>(glyph)是把glyph转换为charactor,这里用到了RTTI去判断,如果glyph事实上的确是个charactor*,转换会成功,否则失败,c=NULL。

#2


dynamic_cast 是个模板函数,(glyph)是它的参数
void Checkme(SpellingChecker&),是声明,C++中允许声明时不写参数名
SpellingChecker&  checker和SpellingChecker &checker是一样的

推荐你一本:钱能的那本三十九块五

#3


SpellingChecker&  checker和int  &i是一个道理。int & i是定义了一个int型的引用,而SpellingChecker&  checker则是定义了一个SpellingChecker类型的引用,都是变参,都是传递指针,只不过是类型不同而已。事实上设计模式不只是可以用C++描述,也可以用其它OOP语言描述。如果你对Java比较熟悉,好象有一本《设计模式Java版》
如果你想学C++,我建议先看一看《标准C++与面向对象程序设计》(机械工业出版社)。

#4


妹妹好强啊,敢挑战C++,要不要一起研究一下。

与妹妹合作会很愉快的哦。

#5


哎呀,弱弱的问:你们怎么说得不一样啊

plainsong(伤心的风★短歌) 说:
dynamic_cast不是模板,而是类型转换。

luohualiushui(落花流水) 说:
dynamic_cast 是个模板函数,(glyph)是它的参数



#6


嗬嗬!

就查msdn吧!

#7


呵呵,to plainsong(伤心的风★短歌) 
Iterator<Glyph*>* 里的Irerator不是模板类吗?

#8


Iterator是模板,但dynamic_cast不是,而是新形式的类型转换:
reinterpret_cast:功能最强的类型转换,相当于旧风格的强制类型转换,也就是最危险。
const_cast:去除const和volatile的类型转换,用于指针类型。
static_cast:普通的类型转换,如可以把double类型转换为float类型,但不能把double* 转换为float*,这里要用reinterpret_cast,也不能代替const_cast的功能。
dynamic_cast:对类的指针使用RTTI进行向下转换。是相对比较安全的类型转换。但由于用到了RTTI,也要谨慎使用。

#9


我查了msdn和the C++ programing language都没找到dynamic_cast的实现
呵呵,这个问题其实没必要深究

#10


Iterator<Glyph*>* 毫无疑问是模板。

但dynamic_cast<charactor*>(glyph)说是模板欠妥,但是跟模板其实很相似,姑且非正式的认为是一种特殊模板吧。它的作用是运行时刻的类型转换,前面的朋友已解释。工作上其它它跟模板一样要生成相应的功能代码。不必刻意的把它的模板区分开来,知道它的功能作用是最重要的。

至于你提到的引用,只不过的基本类型和自定义类型的引用区别,一样的。

#1


dynamic_cast不是模板,而是类型转换。
dynamic_cast_<charactor*>(glyph)是把glyph转换为charactor,这里用到了RTTI去判断,如果glyph事实上的确是个charactor*,转换会成功,否则失败,c=NULL。

#2


dynamic_cast 是个模板函数,(glyph)是它的参数
void Checkme(SpellingChecker&),是声明,C++中允许声明时不写参数名
SpellingChecker&  checker和SpellingChecker &checker是一样的

推荐你一本:钱能的那本三十九块五

#3


SpellingChecker&  checker和int  &i是一个道理。int & i是定义了一个int型的引用,而SpellingChecker&  checker则是定义了一个SpellingChecker类型的引用,都是变参,都是传递指针,只不过是类型不同而已。事实上设计模式不只是可以用C++描述,也可以用其它OOP语言描述。如果你对Java比较熟悉,好象有一本《设计模式Java版》
如果你想学C++,我建议先看一看《标准C++与面向对象程序设计》(机械工业出版社)。

#4


妹妹好强啊,敢挑战C++,要不要一起研究一下。

与妹妹合作会很愉快的哦。

#5


哎呀,弱弱的问:你们怎么说得不一样啊

plainsong(伤心的风★短歌) 说:
dynamic_cast不是模板,而是类型转换。

luohualiushui(落花流水) 说:
dynamic_cast 是个模板函数,(glyph)是它的参数



#6


嗬嗬!

就查msdn吧!

#7


呵呵,to plainsong(伤心的风★短歌) 
Iterator<Glyph*>* 里的Irerator不是模板类吗?

#8


Iterator是模板,但dynamic_cast不是,而是新形式的类型转换:
reinterpret_cast:功能最强的类型转换,相当于旧风格的强制类型转换,也就是最危险。
const_cast:去除const和volatile的类型转换,用于指针类型。
static_cast:普通的类型转换,如可以把double类型转换为float类型,但不能把double* 转换为float*,这里要用reinterpret_cast,也不能代替const_cast的功能。
dynamic_cast:对类的指针使用RTTI进行向下转换。是相对比较安全的类型转换。但由于用到了RTTI,也要谨慎使用。

#9


我查了msdn和the C++ programing language都没找到dynamic_cast的实现
呵呵,这个问题其实没必要深究

#10


Iterator<Glyph*>* 毫无疑问是模板。

但dynamic_cast<charactor*>(glyph)说是模板欠妥,但是跟模板其实很相似,姑且非正式的认为是一种特殊模板吧。它的作用是运行时刻的类型转换,前面的朋友已解释。工作上其它它跟模板一样要生成相应的功能代码。不必刻意的把它的模板区分开来,知道它的功能作用是最重要的。

至于你提到的引用,只不过的基本类型和自定义类型的引用区别,一样的。