假设我有一个这样的课程:
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
,因为它会返回引用。
我该如何解决这个问题?
答案 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; }
};