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_settypedef内のmember<>への3番目のテンプレートパラメータとして使用されるメンバーへのポインタ値へのアクセスです。そのポインタ値を取得できれば、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_containerfriend

または、それらをすべてpublic.

于 2010-08-15T01:28:47.663 に答える