Доступ к приватным членам из потомка дружественного класса
От: Gwynn Россия  
Дата: 24.01.06 11:05
Оценка:
Привет всем!

Возник вопрос. Есть у нас к примеру некоторый абстрактный класс CBase. Он является дружественным классу CBase2. Мы создаем наследника CBase, конкретный класс CExt и реализуем в нем все абстрактные методы CBase. Однако CExt по нормам языка уже не является дружественным классу CBase2, хотя есть необходимость получить из реализации абстрактных методов CBase доступ к CBase2. Можно ли обойти такую проблему и как? Другими словами нужно сделать примерно следующее:


class CBase2
{
        friend class CBase
public:
        CBase2()
        {
        }
        ~CBase2()
        {
        }
private:
        float f;
};

class CBase
{
public:
        CBase()
        {
        }
        ~CBase()
        {
        }

        virtual void DoSome(CBase2*) = 0;
};

class CExt : public CBase
{
public:
        CExt()
        {
        }
        ~CExt()
        {
        }
        virtual void DoSome(CBase2* obj)
        {
                obj->f = 1.1f;
        }
};


Заранее спасибо за ответы.
Re: Доступ к приватным членам из потомка дружественного клас
От: Greg Zubankov СССР  
Дата: 24.01.06 11:11
Оценка: 2 (1)
Здравствуйте, Gwynn, Вы писали:

Например так:
class CBase2
{
        friend class CBase
public:
        CBase2()
        {
        }
        ~CBase2()
        {
        }
private:
        float f;
};

class CBase
{
public:
        CBase()
        {
        }
        ~CBase()
        {
        }

        virtual void DoSome(CBase2*) = 0;

protected:
        float& GetF(CBase2* obj) { return obj->f; }
};

class CExt : public CBase
{
public:
        CExt()
        {
        }
        ~CExt()
        {
        }
        virtual void DoSome(CBase2* obj)
        {
                float& f = GetF(obj);
                f = 1.1f;
        }
};
Re: Доступ к приватным членам из потомка дружественного клас
От: Bell Россия  
Дата: 24.01.06 11:16
Оценка: 2 (1)
Здравствуйте, Gwynn, Вы писали:


class CBase2
{
   friend class CBase;
public:
   CBase2()
   {
   }
   ~CBase2()
   {
   }
private:
   float f;
};

class CBase
{
protected:
   float& GetMemF(CBase2* ptr) { return ptr->f; }//Вариант 1
   void SetMemF(CBase2* ptr, float f) {ptr->f = f; }//Вариант 2
public:
   CBase()
   {
   }
   ~CBase()
   {
   }

   virtual void DoSome(CBase2*) = 0;
};

class CExt : public CBase
{
public:
   CExt()
   {
   }
   ~CExt()
   {
   }
   virtual void DoSome(CBase2* obj)
   {
      GetMemF(obj) = 1.1f;//Вариант 1
      SetMemF(obj, 1.1f);//Вариант 2
   }
};


ЗЫ
Однако подобные выкрутасы наводят на определенные размышления...
Любите книгу — источник знаний (с) М.Горький
Re[2]: Доступ к приватным членам из потомка дружественного к
От: Gwynn Россия  
Дата: 24.01.06 11:29
Оценка:
Здравствуйте, Greg Zubankov,

Спасибо, то что нужно
Re[2]: Доступ к приватным членам из потомка дружественного к
От: Константин Ленин  
Дата: 24.01.06 13:26
Оценка:
Это конечно вариант, но что-то с архитектурой не так
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.