Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/12: Рейтинг темы: голосов - 12, средняя оценка - 4.50
Saiberg
19 / 19 / 2
Регистрация: 23.09.2010
Сообщений: 193
1

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

09.04.2011, 17:07. Просмотров 2227. Ответов 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() не вызывается, а вроде как должна(???)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2011, 17:07
Ответы с готовыми решениями:

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class...

Доступ к закрытым элементам класса - Вопрос
Доброго всем времени суток. Итак, столкнулся с одной непонятной вещью,...

Как получить доступ к элементам формы из созданного класса?
Всем доброго времени суток!:help: Скажите, пожалуйста, как мне обратиться к...

Классы С++, получить доступ из одного класса к элементам другого
Здравствуйте! Объясните пожалуйста, вот имеется у меня два класса,например...

Специализация метода темплейтного класса вложенного в темплейтный класс
Есть два темплейтных класса template &lt;bool T2&gt; class B { void b(); } ...

13
Ma3a
Эксперт С++
619 / 463 / 57
Регистрация: 28.01.2011
Сообщений: 605
09.04.2011, 17:27 2
Вызвать вы его сможете либо прямо обращаясь к объекту переданного в качестве параметра класса и вызывая его метод, либо если метод статический, то через BaseClass::baseHello(). Иначе никак не выйдет.
1
Saiberg
19 / 19 / 2
Регистрация: 23.09.2010
Сообщений: 193
09.04.2011, 17:33  [ТС] 3
доступ к элементам объемлющего класса

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

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

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

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

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

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

Если вложенный класс нуждается в определении класса
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
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"; };
};
0
Saiberg
19 / 19 / 2
Регистрация: 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"; };
};
тут только объявление. объявлений может быть несколько, определение одно.
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
09.04.2011, 18:03 8
Не соглашусь, если есть фигурные скобки, это уже определение, это из опыта. В качестве опровержения хотелось бы ссылку какую-нибудь. Но это частность.

Посмотри я там код исправил, он компилится, это то что тебе надо?
0
Saiberg
19 / 19 / 2
Регистрация: 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;
ну или я тебя не правильно понял

насчет кода не знаю, мне кажется это не то, что спрашивалось в вопросе%)
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
09.04.2011, 18:34 10
А ну ясно, ты определял класс
BaseClassClass

Ну я тогда не знаю. Последний раз усомнюсь- разве правильно определять вложенный
класс ВНЕ public, private или protected? (см. ссылку) Если допустимо, тогда
хз в чём дело.
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
28.06.2011, 20:08 11
...Первый ответ вроде как "да", надо просто другом объявить и всё
13.10
0
Mr.X
Эксперт С++
3180 / 1707 / 435
Регистрация: 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()
{
    
}
0
easybudda
Модератор
Эксперт CЭксперт С++
10119 / 6026 / 1511
Регистрация: 25.07.2009
Сообщений: 11,418
28.06.2011, 22:00 13
C++
1
2
3
4
5
6
7
class A {
  friend class B {
    friend class A;
    //...
  };
  //...
};
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
12.03.2013, 18:54 14
Цитата Сообщение от kravam Посмотреть сообщение
Класс, объявленный внутри другого класса, называется вложенным. Он
является членом объемлющего класса, а его определение может находиться
в любой из секций public, private или protected объемлющего класса.
вот я лоханулся-то, по предъявленной ссыли, чуть пониже:
Вложенный класс разрешается определять вне тела объемлющего
0
12.03.2013, 18:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2013, 18:54

Доступ к элементам массива
Имеется следующий код: #include &lt;QCoreApplication&gt; #include &lt;vector&gt;...

Доступ к элементам unordered_map
struct Foo { int a,b,c; }; std::unordered_map&lt;std::pair&lt;int32_t,...

Доступ к элементам multimap по ключу
Подскажите, как обратиться к элементам по ключу?


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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