复制对类成员资源的引用

时间:2015-02-24 01:37:06

标签: c++

我的课程定义如下:

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 ......

2 个答案:

答案 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 conststd::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 - 以各种方式对上述内容进行限定。