当前位置:  开发笔记 > 编程语言 > 正文

C++类识别问题

如何解决《C++类识别问题》经验,为你挑选了1个好方法。

我将以示例的形式对此进行说明,以使其更加清晰.

说我有一个动物矢量,我想通过阵列,看看元素是狗还是猫?

class Dog: public Animal{/*...*/};
class Cat: public Animal{/*...*/};

int main()
{
vector stuff;
//cramming the dogs and cats in...

for(/*all elements in stuff*/)
//Something to the effect of:  if(stuff[i].getClass()==Dog) {/*do something*/}

}

我希望有点清楚.我知道关于typeid,但是我没有任何Dog对象来比较它,如果可以的话我想避免创建一个Dog对象.

有没有办法做到这一点?提前致谢.



1> Johannes Sch..:

正如其他人所指出的那样,你既不应该使用typeid,也不应该使用dynamic_cast运算符来获得指针指向的动态类型.创建虚函数是为了避免这种肮脏.

无论如何,如果你真的想要这样做,你会这样做(请注意,取消引用迭代器会给你Animal*.所以,如果你这样做,**it你会得到一个Animal&):

for(std::vector::iterator it = v.begin(); it != v.end(); ++it) {
    if(typeid(**it) == typeid(Dog)) {
        // it's a dog
    } else if(typeid(**it) == typeid(Cat)) {
        // it's a cat
    }
}

请注意,您也可以将typeid运算符应用于自身类型,如上所示.您不需要为此创建对象.另请注意,如果将指针传递给它,则typeid方式不起作用typeid(*it).像这样使用它会给你typeid(Animal*)哪个没用.

类似,dynamic_cast可以使用:

for(std::vector::iterator it = v.begin(); it != v.end(); ++it) {
    if(Dog * dog = dynamic_cast(*it)) {
        // it's a dog (or inherited from it). use the pointer
    } else if(Cat * cat = dynamic_cast(*it)) {
        // it's a cat (or inherited from it). use the pointer. 
    }
}

请注意,在这两种情况下,您的Animal类型应该是多态的.这意味着它必须拥有或继承至少一个虚函数.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有