Доступ к защищенным членам friend'a из потомков
От: .A.Fas Украина  
Дата: 28.09.03 08:50
Оценка:
Hi All !

есть такой код:
class B
{
public:
  void method1()
  {
     F    f;
     f.m = 0;
  }
};

class D : public B
{
public:
  void method1()
  {
    F    f;
    f.m = 1;
  }
};

class F
{
  friend class B;
protected:
  int    m;
};


и получаю
error C2248: 'F::m' : cannot access private member declared in class 'F'
на строке f.m = 1;

class F
{
  friend class D; 
  ...
не катит (во время разработки B и F о D поидее ничего не извесно)

class F
{
  public: int m; 
...
крайне нежелательно

class F
{
  public: F::SetM(int)
  ...
не катит (лучше уже использовать 2)


Как еще можно это сделать ?
Может есть способ разрешить доступ производному классу декларативно ?

С уважением .Alex
Re: Доступ к защищенным членам friend'a из потомков
От: Другой Аноним  
Дата: 28.09.03 08:59
Оценка:
Здравствуйте, .A.Fas, Вы писали:

class B
{
public:
  void method1()
  {
    F f;
    alter_f(f, 0);
  }
protected:
  void alter_f(F& f, int val)
  {
    f.m = val;
  }
};

class D : public B
{
public:
  void method1()
  {
    F f;
    alter_f(f, 1);
  }
};

// class F is left unchanged...


AF>Может есть способ разрешить доступ производному классу декларативно ?


Нет такого способа. Дружба всегда бывает только с кем-то конкретно.
Re: Доступ к защищенным членам friend'a из потомков
От: gribunin Россия  
Дата: 28.09.03 09:30
Оценка:
Дружба не распорстраняется на потомков. В вашем случае, можно было написать следующий код:

class B
{
public:
  void method1()
  {
     F f;
     setM(f, 0);
  }
protected:
  void setM(F& f, int m) { f.m = m; }
};

class D : public B
{
public:
  void method1()
  {
    F f;
    setM(f, 1);
  }
};


=====
Кирилл
----------------
Кирилл Грибунин
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.