如何设计const成员函数,防止它修改对象

时间:2011-03-16 10:35:30

标签: c++

这是一个const成员函数,它允许我获取树的最小节点:

BinarySearthTree* BinarySearchTree::min() const                                        
{                                                                                      
    // Return the minimum node (left-most node) value of the tree                      
    BinarySearchTree * next = (BinarySearchTree *) this;                               

    for (next ; next != NULL; next = next->pLeft)                                      
        if (next->pLeft == NULL)                                                       
            return next;                                                               
}

我必须在将“this”指针分配给“next”时抛弃它的常量,但这实际上增加了我可以修改'this'指向的值的潜力?而不是总是提醒自己不要修改任何“下一个”点,是否有办法通过更好地设计函数来防止它发生?

2 个答案:

答案 0 :(得分:3)

制作next const

const BinarySearthTree* BinarySearchTree::min() const                                        
{                                                                                      
    // Return the minimum node (left-most node) value of the tree                      
    const BinarySearchTree *next;                               

    for (next = this; next != NULL; next = next->pLeft)                                      
        if (next->pLeft == NULL)                                                       
            return next;
    return NULL;                                                               
}

答案 1 :(得分:1)

如果您不希望修改内容,则应使min()返回指向const对象的指针。

因此,您的next变量也应该是指向const对象的指针。

以下是我认为您的方法应该如何显示:

const BinarySearchTree* BinarySearchTree::min() const
{
    // Return the minimum node (left-most node) value of the tree
    for (const BinarySearchTree* next = this; next != NULL; next = next->pLeft)
    {
        if (next->pLeft == NULL)
        {
            return next;
        }
    }
    return this;
}

另外,在C ++中,你应该避免使用C风格的强制转换。为此目的存在const_cast

BinarySearchTree* next = const_cast<BinarySearchTree*>(this);

但在这种情况下,这不是必需的。