0

所以你有一个班级员工

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 访问我的员工类的私有数据成员的权限。我只是不知道该怎么做:-/

4

2 回答 2

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;
}
于 2010-08-15T03:17:15.613 回答
0

忘掉它。Boost 可以选择从其内部的任何位置访问您的对象,并且友谊永远不会传递,因此无法通过外部结构与内部结构成为朋友。

您可以尝试将这些数据成员放在私有基类中。然后“特权”操作是从 中提取基础employee,这可以mutli_index_container在您自己的代码中的实例化点完成,不需要friends。

或者,将它们全部制作public

于 2010-08-15T01:28:47.663 回答