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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Может ли объект-член, или объект-элемент достучаться к содержащему его? - C++

14.03.2014, 09:27. Просмотров 1537. Ответов 58
Метки нет (Все метки)

Предположим,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A
{
 ...
};
class B
{
 ....
 A a;
...
};
class C
{
 ...
 A *a;
 ...
}
...
B b1;
B *b2;
C c;
size_t i;
...
. Может ли b1.a достучаться до b1, b2[i].a к b2[i], а c.a[i] - до c? Данные по c.a и b2 могут перемещаться reallocом.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2014, 09:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Может ли объект-член, или объект-элемент достучаться к содержащему его? (C++):

Если объект константный, означает ли это, что ни один его член-элемент или член-метод не изменится? - C++
Назрел такой вопрос: Если объект константный это означает, что ни один его член-элемент или член-метод не изменится или только некоторые из...

Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект - C++
Други мои , кодеры. Не могу я ни как передать в функцию объект класса , или что еще лучше(для меня , так как учусь работать с указателями)...

Основы: указатель на объект или объект, что выбрать? - C++
Не до конца понимаю (или вообще не понимаю) когда лучше использовать указатель на объект, а когда объект. Например: // есть класс ...

Может ли функция иметь аргументом другую функцию или объект? - C++
Внимание тупой вопрос )) А может ли функция иметь аргументом другую функцию или объект?

Реализовать двухсвязный список. Каждый элемент списка может содержать один объект - C++
Здравствуйте, мне нужно было реализовать двухсвязный список. Каждый элемент списка может содержать один объект. Объект может быть трех...

при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! - C++
Друзья! Обнаружил пробел в знаниях. Собсно, вопрос в теме. Дополню лишь: поля объекта меняются на нужные значения и безо всякого возврата...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
14.03.2014, 09:53 #2
А почему нет? В классе А есть методы, которым можно передавать поля класса В. В чем проблема то?
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 11:31  [ТС] #3
Цитата Сообщение от Ilot Посмотреть сообщение
В классе А есть методы, которым можно передавать поля класса В
Кто сказал, что они есть?

Добавлено через 1 минуту
Цитата Сообщение от Ilot Посмотреть сообщение
В чем проблема то?
А где требуемый объект находится? Фокус в том, что даже смещение от this может быть переменным.
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
14.03.2014, 11:42 #4
Цитата Сообщение от taras atavin Посмотреть сообщение
Может ли b1.a достучаться до b1
как это понять "достучатся" ? что именно необходимо, можно хоть небольшой пример ?
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 11:43  [ТС] #5
Ну вызвать какой-нибудь метод b1, или прочитать другой член-данное b1.
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
14.03.2014, 11:51 #6
что то сомневаюсь, если только прочитать член данное, и то это зависит от того как распределяется память, т.е переносимости не будет
а насчет вызова метода вряд ли вообще, если только член данное будет указателем на ф-цию член

Добавлено через 51 секунду
taras atavin, какие то слишком хитрые Вы решения придумываете, может осветить проблему, что бы попробовать найти другой подход к ее решению ?
0
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
14.03.2014, 11:51 #7
Цитата Сообщение от taras atavin Посмотреть сообщение
А где требуемый объект находится? Фокус в том, что даже смещение от this может быть переменным.
Нигде пока вы не выделите для него память или не объявите в тексте программы. Это для класса С.
Объявите класс А другом В и С:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class B
{
 ....
friend class A;
 A a;
...
};
class C
{
 ...
friend class A;
 A *a;
 ...
}
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 12:00  [ТС] #8
Цитата Сообщение от Ilot Посмотреть сообщение
Нигде пока вы не выделите для него память или не объявите в тексте программы.
Пока для b1 не выделена память, его члены вообще не могут быть созданы, но по условию член b1 класса A уже существует, вызван его метод и этот метод что то делает.

Добавлено через 1 минуту
Цитата Сообщение от Ilot Посмотреть сообщение
Объявите класс А другом В и С:
И где это я помянул protected?

Добавлено через 6 минут
Цитата Сообщение от aLarman Посмотреть сообщение
taras atavin, какие то слишком хитрые Вы решения придумываете, может осветить проблему, что бы попробовать найти другой подход к ее решению ?
Очень хорошо. Значит в разделе, посвящённом указателю parent можно писать полную отсебятину?
0
somebdy
7 / 7 / 1
Регистрация: 30.04.2013
Сообщений: 25
14.03.2014, 12:02 #9
Цитата Сообщение от taras atavin Посмотреть сообщение
И где это я помянул protected?
У вас не наследование. Класс A дружественный классу B хоть как имеет доступ к закрытым членам класса B.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 12:04  [ТС] #10
Цитата Сообщение от somebdy Посмотреть сообщение
A дружественный классу B хоть как имеет доступ к закрытым членам класса B.
Ключевое слово здесь - прилагательное "закрытым". Где я помянул protected?
0
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
14.03.2014, 12:06 #11
Цитата Сообщение от taras atavin Посмотреть сообщение
Где я помянул protected?
По умолчанию поля класса имеют спецификатор доступа private.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 12:09  [ТС] #12
Цитата Сообщение от Ilot Посмотреть сообщение
По умолчанию поля класса имеют спецификатор доступа private.
И явно указать иное, конечно же, нельзя.
0
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
14.03.2014, 12:11 #13
Цитата Сообщение от taras atavin Посмотреть сообщение
И явно указать иное, конечно же, нельзя.
Можно, но вы же этого не сделали. Вы описали свои классы и я должен был догадаться, что за многоточием скрывается спецификатор public?
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 12:17  [ТС] #14
Эйси. Но ведь доступ к членам другого класса рассматривается не в сферическом вакууме, а применительно к случаю агрегации объектов. Какое отношение спецификаторы имеют к данному аспекту? И я ведь ещё специально помянул место нахождения в памяти объекта, владеющего вызываемыми методами. А спецификаторы за 13 то лет можно и выучить. Вниз доступ при агрегации проблем не вызывает, так как методы B уж точно знают смещения полей, а метод C кроме того знаком со значением индекса. А вверх?
0
DrOffset
7154 / 4295 / 969
Регистрация: 30.01.2014
Сообщений: 7,099
14.03.2014, 13:32 #15
Цитата Сообщение от taras atavin Посмотреть сообщение
А вверх?
Чтобы это было возможо, придется хранить в агрегируемом классе ссылку или указатель на агрегирующий.

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class A;
 
class Aa
{
public:
    Aa(A & parent) : parent_(parent) {}
 
private:
    A & parent_;
};
 
class Ab
{
public:
    Ab(A & parent) : parent_(parent) {}
 
private:
    A & parent_;
};
 
class A
{
public:
    A() : a(*this), b(*this) {}
 
private:
    friend class Aa; // для полного доступа. Можно убрать, если он не нужен.
    friend class Ab;
 
    Aa a;
    Ab b;
};
Стоит заметить ,что у этого есть свои ограничения. Например, в конструкторах и деструкторах таких классов нельзя обращаться к данным родителя. Т.к. они могут быть либо еще не созданы, либо уже уничтожены. Собственно поэтому подобная фича не доступна по умолчанию.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2014, 13:32
Привет! Вот еще темы с ответами:

Как достать объект-контейнер, а не его элемент - C++
Добрый вечер всем. Возник вопрос. Я читал Страуструпа и на одной из его глав, есть упражнение по созданию класса-контейнера, в...

Объект osteram& или как его вывести в переменную ? - C++
Здравствуйте Объект osteram& или как его вывести в переменную ? cin... cout... printf... scanf А вот как же вывети поток...

Указатель на объект из указателя на член класса - C++
Что как-то сей вопрос ставит меня в тупик. class A { int i; } obj; int main()

интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект - C++
Привет всем. Необходимо реализовать интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект. Не...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.03.2014, 13:32
Ответ Создать тему
Опции темы

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