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 对我的员工类的私有数据成员的访问权限。我只是不知道该怎么做:-/
so you have a class employee
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;
};
and you have private data members for encapsulation. But now you want to use a 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;
so I could use 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;
but what I'd really like to do is to grant employee_set access to my employee class's private data members. I just can't figure out how to do it :-/
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果我理解正确的话,它实际上是对成员指针值
&employee::m_name
的访问,用作 member<> 的第三个模板参数。在employee_set typedef 中,这会导致访问冲突(即编译器错误)。如果可以获得该指针值,那么它将在 Boost.MultiIndex 代码中传递,并且可以从任何地方调用,并且不需要进行访问检查。现在,我不知道类员工如何能够与顶级 typedef 建立友谊(我认为您只能向类和函数授予友谊),但是您可以使employee_set成为新类的公共成员,并授予友谊到那个班级:If I'm understanding this correctly, it is actually the access to the pointer-to-member value
&employee::m_name
, used as the third template parameter to member<> within the employee_set typedef, that causes the access violation (i.e. compiler error). If that pointer value could be obtained, it would then be passed around within the Boost.MultiIndex code and could be invoked from wherever, and no access checks would need to be made. Now, I don't know how class employee could grand friendship to a top-level typedef (I think you can only grant friendship to classes and functions), but you could make the employee_set a public member of a new class, and grant friendship to that class:忘记它吧。 Boost 可以选择从对象内部的任何位置访问您的对象,并且友谊永远不会传递,因此无法通过外部结构与内部结构建立友谊。
您可以尝试将这些数据成员放入私有基类中。然后,“特权”操作是从
employee
中提取基数,这可以在您自己的代码中实例化mutli_index_container
时完成,无需friend
或者,将它们全部设为
公开
。Forget about it. Boost can choose to access your object from anywhere in its internals, and friendship is never transitive, so there is no way to befriend an internal structure via an external one.
You might try putting those data members in a private base class. Then the "privileged" operation is extracting the base from
employee
, which can be done at the point of instantiation ofmutli_index_container
within your own code, nofriend
s needed.Or, just make them all
public
.