Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Наследование и friend class
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Jonano Jonano вне форума
Специалист
 
Аватар для Jonano
 
Сообщений: 3,541
Сказал(а) спасибо: 2
Поблагодарили 14 раз(а) в 14 сообщениях
Регистрация: 19.04.2005
По умолчанию Наследование и friend class - 14.10.2010, 17:10

Здравствуйте. У меня в коде есть такая ситуация (опишу на примере):

Код:
class Class1
{
protected:
    class Class2
    {
        friend class Class1;
    private:
        int mData;
    };

public:
    int Fun()
    {
        Class2 obj;
        obj.mData = 1;     // тут мы успешно можем получить доступ к полю
    }
};

class Class3: protected Class1
{
public:
    int Fun()
    {
        Class2 obj;
        obj.mData = 2;    // тут вылетает ошибка, что поле mData - закрытый член класса
    }
};
Как можно сделать наследуемый класс Class3 другом для вложенного класса Class2? Или тут единственный способ - это добавить публичный метод в классе Class2 для доступа к этому полю?
Ответить с цитированием
  (#2 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 14.10.2010, 17:56

Все правильно. Дружественные отношения не наследуются.
Что мешает объявить другом Class2 не только Class1, но и Class3 тоже?
[CPP] class Class2
{
friend class Class1;
friend class Class3; // объявление и реализация классов Class3
friend class ClassXXX; // и ClassXXX могут быть позже, могут быть в
// другом файле, а могут и вовсе отсутствовать!

private:
int mData;
};

[/CPP]
Но вообще, я бы подумал.... Дружба - очень сильное оружие, все "потроха" класса открываются друзьям, и в не очень умелых руках оно может наделать бед...


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#3 (permalink)) Старый
Jonano Jonano вне форума
Специалист
 
Аватар для Jonano
 
Сообщений: 3,541
Сказал(а) спасибо: 2
Поблагодарили 14 раз(а) в 14 сообщениях
Регистрация: 19.04.2005
По умолчанию 14.10.2010, 18:03

Цитата:
Сообщение от Влад Посмотреть сообщение
Что мешает объявить другом Class2 не только Class1, но и Class3 тоже?
Проблема в том, что предполагаются, что классы Class1 и Class2 совершенно не знают, будет ли наследование или нет. Class1 совершенно самостоятелен, я просто для одной из задач сделал обёртку на него.
Ответить с цитированием
  (#4 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 15.10.2010, 13:26

Ээээ, нет. Не согласен. Разработчику (проектировщику) в какой-то момент нужно абсолютно четко решить: будет ли разрешено наследование от какого-либо класса - а это влечет за собой совершенно определенные технические решения в реализации, либо не будет (а это тоже влечет определенные технические решения, но другие). Конечно, можно оставить иерархию классов в "подвешенном" состоянии, отложив решение до лучших времен.... но подобная политика решением по сути не является - все равно в какой-то момент окончательное решение придется принять.
Вот попробуй определиться с этим. Т.е. попробуй посмотреть на систему с уровня чуть выше кода........


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#5 (permalink)) Старый
Jonano Jonano вне форума
Специалист
 
Аватар для Jonano
 
Сообщений: 3,541
Сказал(а) спасибо: 2
Поблагодарили 14 раз(а) в 14 сообщениях
Регистрация: 19.04.2005
По умолчанию 15.10.2010, 15:47

Наследование то разрешено, но откуда вложенному классу в базовом классе знать, как будет именоваться наследуемый класс? Если в базовый класс по мере необходимости прописывать friend class xxx прописывать, это получается какое-то громоздкое и негибкое решение.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 15.10.2010, 16:05

Ага. Ну, раз наследование заведомо разрешено, и вложенному классу не известно (да и не может быть заранее известно), как именно будет именоваться наследник в n-ном колене, то логично было бы сделать, чтобы базовый класс предоставлял некоторый интерфейс доступа к вложенному классу. А все наследники - просто этот интерфейс использовали бы. Не?


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#7 (permalink)) Старый
Jonano Jonano вне форума
Специалист
 
Аватар для Jonano
 
Сообщений: 3,541
Сказал(а) спасибо: 2
Поблагодарили 14 раз(а) в 14 сообщениях
Регистрация: 19.04.2005
По умолчанию 15.10.2010, 16:44

Ну, через интерфейс и пришлось...
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс, наследование Хание Visual C++ 15 21.12.2011 02:36
наследование классов milaxa С/С++ 13 19.12.2011 01:31
шаблоны...наследование milaxa Задания за деньги 3 17.12.2011 16:32
Наследование и fk ykyk PostgreSQL 0 12.09.2007 11:25
Как обратиться члену класса через его friend функцию, которая static Michael Gewlitch С/С++ 12 01.05.2007 12:32
Наследование и шаблоны infant С/С++ 7 17.02.2006 14:39
Множественное наследование Dian Мысли вслух 5 21.12.2005 18:30
Проблема с friend -функцией Юджин С/С++ 8 24.11.2005 12:56
Неправильное наследование wils0n С/С++ 4 15.11.2005 16:24
Нужно полностью заменить class CChildView на class ListView public CListCtrl Palmman Visual C++ 13 27.09.2005 21:12
Как добавить в dll friend-функцию класса veresk Visual C++ 1 08.10.2003 15:23
Наследование и dynamic_cast Anonymous С/С++ 2 18.06.2003 18:58



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов