0

我有以下类和方法:

//Base class
class Node {
    public:
        virtual ~Node() {};
        Node() {};
    private:
        // Private things for my implementation.
};

class Element : public Node {
    public:
        // Returns the name of the element.
        const xml::String &name() const {
            return eleName;
        }

        static bool is_Element(const Node *base) {
            Element *p = NULL;
            p = dynamic_cast<Element*>(base);
            return (p!=NULL);
        }

        static const Element *to_Element(const Node *base) {
            return dynamic_cast<Element*>(base);   
        }

    private:
        s_namespace eleNamespace;
        xml::String &eleName;
        // Private things for my implementation.
};

在这里,当我动态转换时,它会显示以下编译错误。如何纠正它?一种方法是简单地删除const参数。但我认为这不是正确的方法。

oops.cpp:在静态成员函数'static bool xml::Element::is_Element(const xml::Node*)'中:oops.cpp:208:44: 错误:不能dynamic_cast'base'(类型为'const class xml ::Node*') 输入 'class xml::Element*' (转换抛弃了 constness) oops.cpp: 在静态成员函数 'static const xml::Element* xml::Element::to_Element(const xml:: Node*)': oops.cpp:213:47: error: cannot dynamic_cast 'base' (of type 'const class xml::Node*') to type 'class xml::Element*' (conversion cast away constness)

4

2 回答 2

8

改为使用dynamic_cast<const Element*>

您还可以通过为 const-Argument 和非 const Argument 实现两个不同的函数来使您的类 const 正确:

    static const Element *to_Element(const Node *base) {
        return dynamic_cast<const Element*>(base);   
    }

    static Element *to_Element(Node *base) {
        return dynamic_cast<Element*>(base);   
    }

所以如果调用者有一个非常量,Node他可能也想要一个非常量Element,现在他可以得到它......

于 2013-03-03T16:34:35.793 回答
2

试试这个:

static bool is_Element(const Node *base) {
    const Element *p = NULL; // Add a const keyword here
    p = dynamic_cast<const Element*>(base); // Add a const keyword here
    return (base!=NULL);
}

同样的to_Element

于 2013-03-03T16:34:26.177 回答