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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 5.00
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
09.04.2011, 17:07     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #1
Ответ как бы знаю(нет , да).
но наверное я что-то не так понимаю, т.к. примерчик написать не получается.

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++ Доступ к закрытым элементам класса - Вопрос
Доступ к элементам tuple в шаблонах C++
C++ Доступ к элементам связного списка
C++ Поиск по элементам класса
C++ интерактивный доступ к элементам списка в С++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
09.04.2011, 17:27     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #2
Вызвать вы его сможете либо прямо обращаясь к объекту переданного в качестве параметра класса и вызывая его метод, либо если метод статический, то через BaseClass::baseHello(). Иначе никак не выйдет.
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
09.04.2011, 17:33  [ТС]     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #3
доступ к элементам объемлющего класса

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

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

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

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

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

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

Если вложенный класс нуждается в определении класса
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
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
 Аватар для 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
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
09.04.2011, 18:03     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #8
Не соглашусь, если есть фигурные скобки, это уже определение, это из опыта. В качестве опровержения хотелось бы ссылку какую-нибудь. Но это частность.

Посмотри я там код исправил, он компилится, это то что тебе надо?
Saiberg
 Аватар для 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
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
09.04.2011, 18:34     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #10
А ну ясно, ты определял класс
BaseClassClass

Ну я тогда не знаю. Последний раз усомнюсь- разве правильно определять вложенный
класс ВНЕ public, private или protected? (см. ссылку) Если допустимо, тогда
хз в чём дело.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
28.06.2011, 20:08     Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? #11
...Первый ответ вроде как "да", надо просто другом объявить и всё
13.10
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,657
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
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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++ Согласно заданию реализовать класс абстрактного типа данных (далее АТД) как динамический массив. Для этого определение класса должно иметь следующие
C++ Доступ к элементам unordered_map
Специализация метода темплейтного класса вложенного в темплейтный класс C++

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

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

Текущее время: 19:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru