2015-02-24 98 views
0

我定义了诸如一类:复制引用类成员资源

class Foo 
{ 
public: 
    void ReturnReferenceToMember(???) 
    { 
     ??? // Give caller a reference to member variable m_x    
    } 
private: 
    std::unordered_map<int, int> m_x; 
} 

什么是C++的方式来实施????

我不想复制地图的内部,我也想继续使用类内的地图。我不明白的举动力学那么好,但像第二个要求否定的std ::举动在我看来......

回答

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 -qualify以各种方式上面。

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 
} 
+0

我简化了我的例子太多。返回类型由HRESULT(Windows事物)用完,所以我需要m_x作为参数。 – bgoosman 2015-02-24 01:46:00