Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562

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

14.03.2014, 09:27. Показов 4590. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.03.2014, 09:27
Ответы с готовыми решениями:

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

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

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

58
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
14.03.2014, 09:53
А почему нет? В классе А есть методы, которым можно передавать поля класса В. В чем проблема то?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.03.2014, 11:31  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
В классе А есть методы, которым можно передавать поля класса В
Кто сказал, что они есть?

Добавлено через 1 минуту
Цитата Сообщение от Ilot Посмотреть сообщение
В чем проблема то?
А где требуемый объект находится? Фокус в том, что даже смещение от this может быть переменным.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
14.03.2014, 11:42
Цитата Сообщение от taras atavin Посмотреть сообщение
Может ли b1.a достучаться до b1
как это понять "достучатся" ? что именно необходимо, можно хоть небольшой пример ?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.03.2014, 11:43  [ТС]
Ну вызвать какой-нибудь метод b1, или прочитать другой член-данное b1.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
14.03.2014, 11:51
что то сомневаюсь, если только прочитать член данное, и то это зависит от того как распределяется память, т.е переносимости не будет
а насчет вызова метода вряд ли вообще, если только член данное будет указателем на ф-цию член

Добавлено через 51 секунду
taras atavin, какие то слишком хитрые Вы решения придумываете, может осветить проблему, что бы попробовать найти другой подход к ее решению ?
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
14.03.2014, 11:51
Цитата Сообщение от 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
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.03.2014, 12:00  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
Нигде пока вы не выделите для него память или не объявите в тексте программы.
Пока для b1 не выделена память, его члены вообще не могут быть созданы, но по условию член b1 класса A уже существует, вызван его метод и этот метод что то делает.

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

Добавлено через 6 минут
Цитата Сообщение от aLarman Посмотреть сообщение
taras atavin, какие то слишком хитрые Вы решения придумываете, может осветить проблему, что бы попробовать найти другой подход к ее решению ?
Очень хорошо. Значит в разделе, посвящённом указателю parent можно писать полную отсебятину?
0
8 / 8 / 3
Регистрация: 30.04.2013
Сообщений: 25
14.03.2014, 12:02
Цитата Сообщение от taras atavin Посмотреть сообщение
И где это я помянул protected?
У вас не наследование. Класс A дружественный классу B хоть как имеет доступ к закрытым членам класса B.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.03.2014, 12:04  [ТС]
Цитата Сообщение от somebdy Посмотреть сообщение
A дружественный классу B хоть как имеет доступ к закрытым членам класса B.
Ключевое слово здесь - прилагательное "закрытым". Где я помянул protected?
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
14.03.2014, 12:06
Цитата Сообщение от taras atavin Посмотреть сообщение
Где я помянул protected?
По умолчанию поля класса имеют спецификатор доступа private.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.03.2014, 12:09  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
По умолчанию поля класса имеют спецификатор доступа private.
И явно указать иное, конечно же, нельзя.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
14.03.2014, 12:11
Цитата Сообщение от taras atavin Посмотреть сообщение
И явно указать иное, конечно же, нельзя.
Можно, но вы же этого не сделали. Вы описали свои классы и я должен был догадаться, что за многоточием скрывается спецификатор public?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.03.2014, 12:17  [ТС]
Эйси. Но ведь доступ к членам другого класса рассматривается не в сферическом вакууме, а применительно к случаю агрегации объектов. Какое отношение спецификаторы имеют к данному аспекту? И я ведь ещё специально помянул место нахождения в памяти объекта, владеющего вызываемыми методами. А спецификаторы за 13 то лет можно и выучить. Вниз доступ при агрегации проблем не вызывает, так как методы B уж точно знают смещения полей, а метод C кроме того знаком со значением индекса. А вверх?
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
14.03.2014, 13:32
Цитата Сообщение от 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
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.03.2014, 13:35  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
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;
};
, ейси.
C++
1
b2=(B*) reaaloc((void*)b2, NeCount);
, адреса агрегирующих объектов могут в этот момент поменяться.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
14.03.2014, 13:39
realloc вроде копирует, не должны, вот только тогда в агрегирующем классе могут слететь ссылки на агрегированные объекты
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.03.2014, 13:40  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Стоит заметить ,что у этого есть свои ограничения. Например, в конструкторах и деструкторах таких классов нельзя обращаться к данным родителя. Т.к. они могут быть либо еще не созданы, либо уже уничтожены. Собственно поэтому подобная фича не доступна по умолчанию.
Уже инициализируется агрегированный объект, а агрегирующего ещё нет. Очень интересно. Или для агрегированный ещё не удалялся, а агрегирующий уже удалён. Также весело.

Добавлено через 1 минуту
Цитата Сообщение от aLarman Посмотреть сообщение
realloc вроде копирует, не должны, вот только тогда в агрегирующем классе могут слететь ссылки на агрегированные объекты
Какого они слетят? Все внутриобъектные смещения константы в пределах класса.
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
14.03.2014, 14:08
Цитата Сообщение от taras atavin Посмотреть сообщение
адреса агрегирующих объектов могут в этот момент поменяться.
Чтобы этого не происходило надо пользоваться С++ средствами для перераспределения памяти, которые вызовут соответствующие деструкторы, соответствующие конструкторы копирования и т.д. Либо реализовывать это поверх realloc самостоятельно. realloc в чистом виде не годится для любых сложны C++ классов, а не только в этом случае.

Добавлено через 9 минут
taras atavin,
Посмотри на досуге вот этот пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <vector>
#include <cstdio>
 
class MyTest
{
public:
    MyTest()               {  printf("%s\n", __PRETTY_FUNCTION__); }
    MyTest(MyTest const &) {  printf("%s\n", __PRETTY_FUNCTION__); }
    ~MyTest()              {  printf("%s\n", __PRETTY_FUNCTION__); }
};
 
int main()
{
    std::vector<MyTest> myTest;
    myTest.reserve(1);
 
    myTest.push_back(MyTest());
    puts("------");
    myTest.push_back(MyTest());
    puts("------");
    myTest.push_back(MyTest());
    puts("------");
}
если хранить приведенный мной выше класс в таком контейнере, то рассогласования ссылок внутри объектов никогда не произодет. Т.к. будут гарантированно вызваны все конструкторы и деструкторы.
А вот копировать с помощью, например, memcpy не-POD типы в С++ в принципе не очень хорошая идея.
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
14.03.2014, 17:25
Пример с использованием указателей на члены класса. (Возможно, не будет работать для любого компилятора.)
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
33
34
35
struct B
{
    void* func();
};
 
struct A
{
    int m; 
    int n;
    B b1;
    B b2;
};
 
void* B::func()
{
    B A::* q; // указатель на член класса ( член, имеющий тип B )
    q = &A::b1; //  0x00000008
 
    int* pInt2 = reinterpret_cast<int*>( &q ); // *pInt2 == 8 , т.е. sizeof(A::m) + sizeof(A::n)
 
    // чтобы получить адрес объекта-агрегата, из this вычитаем 8
    void* parent = reinterpret_cast<char*>(this) - *pInt2;
    return parent;
}
 
int main()
{
    A a;
    cout << "\n &a    " << &a << endl;
 
    void* p = a.b1.func();
    cout << "\n result of  a.b1.func()  " << p << endl;
 
    // ... 
}
Миниатюры
Может ли объект-член, или объект-элемент достучаться к содержащему его?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.03.2014, 17:25
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru