Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

09.04.2011, 17:07. Просмотров 2145. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? (C++):

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

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

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

Классы С++, получить доступ из одного класса к элементам другого - C++
Здравствуйте! Объясните пожалуйста, вот имеется у меня два класса,например вот такие: Class A { private: int i; }

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

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

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

что тогда имеется в виду?
0
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 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 / 1
Регистрация: 23.09.2010
Сообщений: 193
09.04.2011, 17:48  [ТС] #5
Приведите пожалуйста пример иллюстрирующий данный вопрос.

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

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

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

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

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

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

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

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

Согласно заданию реализовать класс абстрактного типа данных (далее АТД) как динамический массив. Для этого определение класса должно иметь следующие - C++
1. Согласно заданию реализовать класс абстрактного типа данных (далее АТД) как динамический массив. Для этого определение класса должно...

Интерактивный доступ к элементам списка - C++
программа должна обеспечивать интерактивный режим просмотра элементов списка. Как это осуществит,кто знает?

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

Доступ к элементам в std::map - C++
У меня возник вопрос. В этом участке кода, есть два цикла, которые выводят содержимое контейнера std::map и вывод идентичен. Рационально...


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

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

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