复制对类成员资源的引用
Copy reference to class member resource
我有一个定义如下的类:
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
}
相关文章:
- 具有瞬态资源的RAII类
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 在没有引用传递资源的情况下,如何在java中简化这些代码
- C++:是否可以有一个模板类来表示对资源的条件引用
- 复制对类成员资源的引用
- CppUtest在测试之间共享资源,未定义引用
- 为渲染对象的所有实例维护一个指向共享纹理/资源的指针/引用的最佳方式