复制对类成员资源的引用

Copy reference to class member resource

本文关键字:引用 资源 成员 复制      更新时间:2023-10-16

我有一个定义如下的类:

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

不能传递可以更改的引用。这意味着传递指向引用的指针或指向引用的引用——这两者在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-限定以上内容。

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
}