Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 5.00
Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
#1

Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? - C++

09.04.2011, 17:07. Просмотров 2003. Ответов 13
Метки нет (Все метки)

Ответ как бы знаю(нет , да).
но наверное я что-то не так понимаю, т.к. примерчик написать не получается.

C++
1
2
3
4
5
6
7
8
9
10
11
class BaseClass { 
public:
    
    class BaseClassClass;
    void baseHello() { std::cout << "123"; };
};
 
class BaseClass::BaseClassClass { 
public:
    void hello() { std::cout << baseHello(); };
};
в рез-те baseHello() не вызывается, а вроде как должна(???)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2011, 17:07     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего?
Посмотрите здесь:
C++ Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
C++ Доступ к закрытым элементам класса - Вопрос
C++ Классы С++, получить доступ из одного класса к элементам другого
Специализация метода темплейтного класса вложенного в темплейтный класс C++
C++ Доступ к элементам unordered_map
C++ Согласно заданию реализовать класс абстрактного типа данных (далее АТД) как динамический массив. Для этого определение класса должно иметь следующие
C++ Доступ к элементам связного списка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ma3a
Эксперт C++
616 / 460 / 31
Регистрация: 28.01.2011
Сообщений: 605
09.04.2011, 17:27     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #2
Вызвать вы его сможете либо прямо обращаясь к объекту переданного в качестве параметра класса и вызывая его метод, либо если метод статический, то через BaseClass::baseHello(). Иначе никак не выйдет.
Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
09.04.2011, 17:33  [ТС]     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #3
доступ к элементам объемлющего класса

что тогда имеется в виду?
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
09.04.2011, 17:42     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #4
Saiberg, существует разница между классами и объектами, так вот вложенность определяет только область видимость, те существует в терминах классов
BaseClass и BaseClassClass разные классы, в каждом из них можно вызывать только свои методы и методы других объектов (по указателю, ссылке, полей-объектов)

Цитата Сообщение от Saiberg Посмотреть сообщение
void hello() { std::cout << baseHello(); };
baseHello метод другого класса, он должен вызываться для другого объекта, вы вызываете его так, будто это ваш метод
Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
09.04.2011, 17:48  [ТС]     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #5
Приведите пожалуйста пример иллюстрирующий данный вопрос.

Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего?

и на этот если можно

78. Можно ли определить вложенный класс внешним образом? Зачем это может понадобиться?
Да. Если вложенный класс нуждается в определении класса, в который он вложен

особо интересно

Если вложенный класс нуждается в определении класса
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,439
09.04.2011, 17:54     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #6
Saiberg,один вопрос, что такое:
C++
1
2
3
4
class BaseClass::BaseClassClass { 
public:
        void hello() { std::cout << baseHello(); };
};
Если это определение класса BaseClass, то я не знаю чё делать ибо у класса может только
в одном месте быть определение, а у тебя в двух уже.

ЕСли это определение класса BaseClassClass, то оно НЕПРАВИЛЬНО.
Вот здесь я прочёл:

Класс, объявленный внутри другого класса, называется вложенным. Он
является членом объемлющего класса, а его определение может находиться
в любой из секций public, private или protected объемлющего класса.

Ну то есть определение надо запихать в другое место.

Добавлено через 2 минуты
Короче прошу прощения если что не так, а я бы сей код реализовал так:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
class BaseClass { 
public:
        
        class BaseClassClass {
         public:
          void hello() {BaseClass obekt; obekt.baseHello(); };
        };
        void baseHello() { std::cout << "123"; };
};
Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
09.04.2011, 17:54  [ТС]     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #7
тут я определяю вложенный класс внешним образом.

эквивалентно

C++
1
2
3
4
5
6
7
8
9
10
11
class BaseClass { 
public:
    
    class BaseClassClass { 
    public:
    
        void hello() { std::cout << baseHello(); };
    };
 
    void baseHello() { std::cout << "123"; };
};
вроде все правильно%)

и кстати

Если это определение класса BaseClass, то я не знаю чё делать ибо у класса может только
в одном месте быть определение, а у тебя в двух уже.

C++
1
2
3
4
5
6
class BaseClass { 
public:
        
        class BaseClassClass;
        void baseHello() { std::cout << "123"; };
};
тут только объявление. объявлений может быть несколько, определение одно.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,439
09.04.2011, 18:03     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #8
Не соглашусь, если есть фигурные скобки, это уже определение, это из опыта. В качестве опровержения хотелось бы ссылку какую-нибудь. Но это частность.

Посмотри я там код исправил, он компилится, это то что тебе надо?
Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
09.04.2011, 18:23  [ТС]     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #9
Не соглашусь, если есть фигурные скобки - правда.

C++
1
2
3
4
5
6
class BaseClass { 
public:
        
        class BaseClassClass;
        void baseHello() { std::cout << "123"; };
};
тут
C++
1
class BaseClassClass;
ну или я тебя не правильно понял

насчет кода не знаю, мне кажется это не то, что спрашивалось в вопросе%)
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,439
09.04.2011, 18:34     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #10
А ну ясно, ты определял класс
BaseClassClass

Ну я тогда не знаю. Последний раз усомнюсь- разве правильно определять вложенный
класс ВНЕ public, private или protected? (см. ссылку) Если допустимо, тогда
хз в чём дело.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,439
28.06.2011, 20:08     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #11
...Первый ответ вроде как "да", надо просто другом объявить и всё
13.10
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
28.06.2011, 21:52     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #12
Цитата Сообщение от Saiberg Посмотреть сообщение
Ответ как бы знаю(нет , да).
Ответ неверный. Вложенный и внешний классы не являются друзьями по умолчанию.
Пример необходимости внешнего определения вложенного класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_outer
{
    struct  T_inner;
};
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_outer::T_inner
{
    T_outer*  p;    
};
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    
}
easybudda
Эксперт CЭксперт С++
9470 / 5483 / 927
Регистрация: 25.07.2009
Сообщений: 10,505
28.06.2011, 22:00     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #13
C++
1
2
3
4
5
6
7
class A {
  friend class B {
    friend class A;
    //...
  };
  //...
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2013, 18:54     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего?
Еще ссылки по теме:
C++ Доступ к элементам multimap по ключу
Доступ к элементам в std::map C++
Доступ к элементам tuple в шаблонах C++
C++ Интерактивный доступ к элементам списка
C++ Вложенные структуры. Доступ к элементам структур

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,439
12.03.2013, 18:54     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #14
Цитата Сообщение от kravam Посмотреть сообщение
Класс, объявленный внутри другого класса, называется вложенным. Он
является членом объемлющего класса, а его определение может находиться
в любой из секций public, private или protected объемлющего класса.
вот я лоханулся-то, по предъявленной ссыли, чуть пониже:
Вложенный класс разрешается определять вне тела объемлющего
Yandex
Объявления
12.03.2013, 18:54     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru