比如:
第二章中的拼写检查和断字处理,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。
dynamic_cast_<charactor*>(glyph)是把glyph转换为charactor,这里用到了RTTI去判断,如果glyph事实上的确是个charactor*,转换会成功,否则失败,c=NULL。
#2
dynamic_cast 是个模板函数,(glyph)是它的参数
void Checkme(SpellingChecker&),是声明,C++中允许声明时不写参数名
SpellingChecker& checker和SpellingChecker &checker是一样的
推荐你一本:钱能的那本三十九块五
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++与面向对象程序设计》(机械工业出版社)。
如果你想学C++,我建议先看一看《标准C++与面向对象程序设计》(机械工业出版社)。
#4
妹妹好强啊,敢挑战C++,要不要一起研究一下。
与妹妹合作会很愉快的哦。
与妹妹合作会很愉快的哦。
#5
哎呀,弱弱的问:你们怎么说得不一样啊
plainsong(伤心的风★短歌) 说:
dynamic_cast不是模板,而是类型转换。
luohualiushui(落花流水) 说:
dynamic_cast 是个模板函数,(glyph)是它的参数
plainsong(伤心的风★短歌) 说:
dynamic_cast不是模板,而是类型转换。
luohualiushui(落花流水) 说:
dynamic_cast 是个模板函数,(glyph)是它的参数
#6
嗬嗬!
就查msdn吧!
就查msdn吧!
#7
呵呵,to plainsong(伤心的风★短歌)
Iterator<Glyph*>* 里的Irerator不是模板类吗?
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,也要谨慎使用。
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)说是模板欠妥,但是跟模板其实很相似,姑且非正式的认为是一种特殊模板吧。它的作用是运行时刻的类型转换,前面的朋友已解释。工作上其它它跟模板一样要生成相应的功能代码。不必刻意的把它的模板区分开来,知道它的功能作用是最重要的。
至于你提到的引用,只不过的基本类型和自定义类型的引用区别,一样的。
但dynamic_cast<charactor*>(glyph)说是模板欠妥,但是跟模板其实很相似,姑且非正式的认为是一种特殊模板吧。它的作用是运行时刻的类型转换,前面的朋友已解释。工作上其它它跟模板一样要生成相应的功能代码。不必刻意的把它的模板区分开来,知道它的功能作用是最重要的。
至于你提到的引用,只不过的基本类型和自定义类型的引用区别,一样的。
#1
dynamic_cast不是模板,而是类型转换。
dynamic_cast_<charactor*>(glyph)是把glyph转换为charactor,这里用到了RTTI去判断,如果glyph事实上的确是个charactor*,转换会成功,否则失败,c=NULL。
dynamic_cast_<charactor*>(glyph)是把glyph转换为charactor,这里用到了RTTI去判断,如果glyph事实上的确是个charactor*,转换会成功,否则失败,c=NULL。
#2
dynamic_cast 是个模板函数,(glyph)是它的参数
void Checkme(SpellingChecker&),是声明,C++中允许声明时不写参数名
SpellingChecker& checker和SpellingChecker &checker是一样的
推荐你一本:钱能的那本三十九块五
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++与面向对象程序设计》(机械工业出版社)。
如果你想学C++,我建议先看一看《标准C++与面向对象程序设计》(机械工业出版社)。
#4
妹妹好强啊,敢挑战C++,要不要一起研究一下。
与妹妹合作会很愉快的哦。
与妹妹合作会很愉快的哦。
#5
哎呀,弱弱的问:你们怎么说得不一样啊
plainsong(伤心的风★短歌) 说:
dynamic_cast不是模板,而是类型转换。
luohualiushui(落花流水) 说:
dynamic_cast 是个模板函数,(glyph)是它的参数
plainsong(伤心的风★短歌) 说:
dynamic_cast不是模板,而是类型转换。
luohualiushui(落花流水) 说:
dynamic_cast 是个模板函数,(glyph)是它的参数
#6
嗬嗬!
就查msdn吧!
就查msdn吧!
#7
呵呵,to plainsong(伤心的风★短歌)
Iterator<Glyph*>* 里的Irerator不是模板类吗?
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,也要谨慎使用。
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)说是模板欠妥,但是跟模板其实很相似,姑且非正式的认为是一种特殊模板吧。它的作用是运行时刻的类型转换,前面的朋友已解释。工作上其它它跟模板一样要生成相应的功能代码。不必刻意的把它的模板区分开来,知道它的功能作用是最重要的。
至于你提到的引用,只不过的基本类型和自定义类型的引用区别,一样的。
但dynamic_cast<charactor*>(glyph)说是模板欠妥,但是跟模板其实很相似,姑且非正式的认为是一种特殊模板吧。它的作用是运行时刻的类型转换,前面的朋友已解释。工作上其它它跟模板一样要生成相应的功能代码。不必刻意的把它的模板区分开来,知道它的功能作用是最重要的。
至于你提到的引用,只不过的基本类型和自定义类型的引用区别,一样的。