Шаблонные классы и ключевое слово friend в c ++ (конкретный пример относится к boost :: multi_index) - PullRequest
0 голосов
/ 15 августа 2010

Итак, у вас есть сотрудник класса

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 доступа к частным данным членов моего класса сотрудников.Я просто не могу понять, как это сделать: - /

Ответы [ 2 ]

1 голос
/ 15 августа 2010

Если я правильно понимаю, на самом деле именно доступ к значению указателя на член &employee::m_name, используемый в качестве третьего параметра шаблона для member <> в 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 голосов
/ 15 августа 2010

Забудьте об этом.Boost может выбрать доступ к вашему объекту из любой точки его внутреннего устройства, и дружба никогда не бывает транзитивной, поэтому нет способа подружиться с внутренней структурой через внешнюю.Базовый класс.Затем «привилегированная» операция извлекает базу из employee, что может быть сделано в момент создания mutli_index_container в вашем собственном коде, friend s не требуется.

Или простоих все public.

...