Привет всем!
Возник вопрос. Есть у нас к примеру некоторый абстрактный класс 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;
}
};
Заранее спасибо за ответы.
Здравствуйте, 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;
}
};
Здравствуйте, 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
}
};
ЗЫ
Однако подобные выкрутасы наводят на определенные размышления...
Здравствуйте, Greg Zubankov,
Спасибо, то что нужно