2010-08-15 12 views
0

讓您擁有一個類別的僱員模板類和C中的關鍵字friend ++(具體的例子指的boost :: multi_index)

class employee { 
public: 
    employee(const string &name, int id) : m_name(name) , m_id(id) {} 

    const string &getName() const { return m_name; } 
    int getID() const { return m_id; } 
private: 
    string &m_name; 
    int m_id; 
}; 

,你必須爲封裝私有數據成員。但現在你想用一個boost :: multi_index ....

typedef multi_index_container < 
    employee, 
    indexed_by< 
     ordered_non_unique< 
      composite_key< 
       Name, 
       member< employee, string & , &employee::m_name>, 
       member< employee, int, &employee::m_id> 
      > 
     > 
     > 
> employee_set; 

所以我可以使用BOOST_INDEX_CONST_MEM_FUN ...

typedef multi_index_container < 
     employee, 
     indexed_by< 
      ordered_non_unique< 
       composite_key< 
        Name, 
        BOOST_MULTI_INDEX_CONST_MEM_FUN(employee, const string&, getName), 
        BOOST_MULTI_INDEX_CONST_MEM_FUN(employee, int, getID) 
       > 
      > 
      > 
    > employee_set; 

但我真的很想做的是給予employee_set的訪問我的員工類的私人數據成員。我只是不知道該怎麼做: -/

回答

0

忘掉它。 Boost可以選擇從內部的任何地方訪問你的對象,而友誼永遠不會傳遞,所以沒有辦法通過外部的方式與內部結構建立聯繫。

您可能會嘗試將這些數據成員放在私有基類中。然後,「特權」操作是從employee中提取基礎,這可以在您自己的代碼中實例化mutli_index_container處完成,不需要friend

或者,讓他們全部public

1

如果我正確理解這一點,它實際上是對成員指針值&employee::m_name的訪問,用作employee_set typedef中成員<>的第三個模板參數,它導致訪問衝突(即編譯器錯誤)。如果可以獲得該指針值,它將在Boost.MultiIndex代碼中傳遞,並且可以從任何地方調用,並且不需要進行訪問檢查。現在,我不知道班級員工如何能夠將高級友誼帶到頂級typedef(我認爲您只能授予類和職能的友誼),但是您可以將employee_set設置爲新班級的公共成員,並授予友誼到該類:

class employee { 
    ... 
    friend struct mytypedefs; 
}; 

struct mytypedefs { 
    typedef multi_index_container < 
    ... &employee::m_name ... 
    > employee_set; 
}; 

int main() { 
    mytypedefs::employee_set my_employee_set; 
} 
+0

指向成員的指針,而不是從它產生的指針,需要存儲並在multi_index模板中傳遞。 – Potatoswatter 2010-08-15 09:41:52

+0

並非如此,該特定模板參數是非類型參數,因此它嵌入成員<>模板實例化的類型中。 – SCFrench 2010-08-15 11:52:59

+0

或者您可以直接在員工中提供employee_set typedef – 2010-08-17 08:57:27