在const方法中使用引用

时间:2011-02-25 14:44:43

标签: c++ class methods const const-correctness

假设我有一个这样的课程:

class LinkedList
{
    struct Node
    {
        int StoredValue;
        // ...
    };

    Node& GetNodeReference(std::size_t Index)
    {
        // ...

        return NodeReference;
    }

    public:

    int Get(std::size_t Index) const
    {
        return GetNodeReference(Index).StoredValue;
    }
};

这不会编译,因为const方法Get使用的GetNodeReference不能const,因为它会返回引用。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:8)

我不确定你要实现的目标,但是你可以提供两个GetNodeReference的重载:

Node& GetNodeReference(std::size_t Index)
{
    // ...

    return NodeReference;
}

const Node& GetNodeReference(std::size_t Index) const
{
    // ...

    return NodeReference;
}

请注意,第二个重载有两个const修饰符,一个在返回类型的行的开头,另一个在行的末尾,用于隐式传递的*this对象。

为避免代码重复,您可以基于const重载实现非const重载:

const Node& GetNodeReference(std::size_t Index) const
{
    // ...

    return NodeReference;
}

Node& GetNodeReference(std::size_t Index)
{
    return const_cast<Node&>(static_cast<const LinkedList&>(*this).getNodeReference(Index));
}

Scott Meyers在 Effective C ++ 的第3项中讨论了这种技术。

答案 1 :(得分:3)

根本不要为列表实现索引Get函数。对于新的开发人员来说,进入并在循环中使用它会变得非常简单,将线性交互转换为多项式迭代。

如果您需要这样的功能,请创建一个自由函数,该函数使用列表的内置迭代器和std::advance来获取所需的节点。

如果你绝对需要成员函数,那么正常的方法是@FredOverflow建议的方法并使用重载(引用他的代码):

const Node& GetNodeReference(std::size_t Index) const
{
    // ...

    return NodeReference;
}

Node& GetNodeReference(std::size_t Index)
{
    return const_cast<Node&>(static_cast<const LinkedList&>(*this).getNodeReference(Index));
}

答案 2 :(得分:1)

这个怎么样?

  

class LinkedList {

     

私人:

struct Node
{
    int StoredValue;
    // ...
};

Node NodeReference;

const Node* const GetNodeReference(std::size_t Index) const
{
    return &NodeReference;
}
     

公共:

int Get(std::size_t Index) const
{
    const Node *const node = GetNodeReference(Index);
    return node->StoredValue;
}
     

};

修改

您可以在评论中阅读

  

const Node * const GetNodeReference(std :: size_t Index)const()...

应更改为:

  

const Node * GetNodeReference(std :: size_t Index)const()...

答案 3 :(得分:0)

我建议:

  

class LinkedList {

     

私人:

struct Node
{
    int StoredValue;
    // ...
};

Node NodeReference;

const Node& GetNodeReference(std::size_t Index) const
{
    return NodeReference;
}
     

公共:

int Get(std::size_t Index) const
{
    const Node node = GetNodeReference(Index);
    return node.StoredValue;
}
     

};