typeid运算符的奇怪行为 - 返回FALSE

时间:2015-05-20 13:39:51

标签: c++

这是我的代码的一部分。问题是为什么使用这一行返回FLASE,我无法进入他的块: 我正试图检查我的物品类型是否等于儿子。 它假设返回true。我在调试中看到它也是如此。

if ((typeid(Candy) == typeid(sArray[0])) && (typeid(Candy) == typeid(&item)))

这是我的代码:

bool Customer::isExistItem(SweetItem& item){

if (Itemsize == 0){
    sArray = new SweetItem*[Itemsize + 1];
    sArray[Itemsize] = &item;
    Itemsize++;

    if ((typeid(Candy) == typeid(sArray[0])) && (typeid(Candy) == typeid(&item))){
        Candy* help1 = dynamic_cast <Candy*> (sArray[0]);
        Candy* help2 = dynamic_cast <Candy*> (&item);

        if (*help1 == *help2){ //The first item in the basket!
            double payment = 0;
            payment += help1->getPrice();
            totalPayment(payment);
        }

        return TRUE;
    }

    else if ((typeid(Cookie*) == typeid(sArray[0])) && (typeid(Cookie*) == typeid(&item))){
        Cookie* help1 = dynamic_cast <Cookie*> (sArray[0]);
        Cookie* help2 = dynamic_cast <Cookie*> (&item);

        if (*help1 == *help2){ //The first item in the basket!
            double payment = 0;
            payment += help1->getPrice();
            totalPayment(payment);
        }

        return TRUE;
    }

    else if ((typeid(IceCream*) == typeid(sArray[0])) && (typeid(IceCream*)   == typeid(&item))){
        IceCream* help1 = dynamic_cast <IceCream*> (sArray[0]);
        IceCream* help2 = dynamic_cast <IceCream*> (&item);

        if (*help1 == *help2){ //The first item in the basket!
            double payment = 0;
            payment += help1->getPrice();
            totalPayment(payment);
        }

        return TRUE;
    }

    else if ((typeid(Cookielida*) == typeid(sArray[0])) &&         (typeid(Cookielida*) == typeid(&item))){
        Cookielida* help1 = dynamic_cast <Cookielida*> (sArray[0]);
        Cookielida* help2 = dynamic_cast <Cookielida*> (&item);

        if (*help1 == *help2){ //The first item in the basket!
            double payment = 0;
            payment += help1->getPrice();
            totalPayment(payment);
        }

        return TRUE;
    }
}

这是我的==运算符看起来不错:

bool Customer::operator ==(const SweetItem& other) const{
for (int i = 0; i < Itemsize; i++){
    if (sArray[i] != &other)
        return FALSE;
}
return TRUE;

}

请看一下我的代码。

1 个答案:

答案 0 :(得分:1)

sArray[0]&item的类型是SweetItem*指针,它永远不会与Candy对象相同。

我想你想要typeid(*sArray[0])typeid(item)来检查对象的动态类型,而不是更通用的类型指针。