我的课程定义如下:
class Foo
{
public:
void ReturnReferenceToMember(???)
{
??? // Give caller a reference to member variable m_x
}
private:
std::unordered_map<int, int> m_x;
}
实现????
的C ++方式是什么?我不想复制地图的内部,我也希望能够在课堂内使用地图。我不太了解移动机制,但在我看来,第二个要求否定了std :: move ......
答案 0 :(得分:2)
void ReturnReferenceToMember(std::unordered_map<int, int>** outMap)
{
*outMap = &m_x;
}
void ReturnReferenceToMember(const std::unordered_map<int, int>** outMap) const
{
*outMap = &m_x;
}
我故意在const
上重载了它,因此您可以使用任何一种形式,具体取决于您Foo
const
是std::unordered_map<int, int>* mapPtr = nullptr;
ReturnReferenceToMember(&mapPtr);
if (mapPtr)
{
std::unordered_map<int, int>& mapRef = *mapPtr;
// now you have your reference
}
。
正如您所看到的,我们在这里并没有真正使用引用,因为那些不能重新设置,但调用者仍然可以使用它们:
{{1}}
答案 1 :(得分:2)
无法传递可更改的引用。这意味着将指针传递给引用或引用引用 - 这两者在C ++中都是无效的。
通常的方法是return
一个引用,而不是(因为它无法完成)传递一个,希望它被改变。
std::unordered_map<int, int>& ReturnReferenceToMember()
{
return m_x;
}
如果您希望传递一个可以更改的参数以允许调用者访问类内部,则必须使用指向指针的指针
// double indirection needed as pointers are passed by value too
void ReturnPointerToMember(std::unordered_map<int, int> **p)
{
*p = &mx;
}
或对指针的引用
void ReturnPointerToMember(std::unordered_map<int, int> *&p)
{
p = &mx; // note the missing asterisk compared with passing pointer to pointer
}
如果您不希望呼叫者更改班级内部,则需要const
- 以各种方式对上述内容进行限定。