2015-02-24 101 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