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

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

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

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

14.03.2014, 09:27. Просмотров 1510. Ответов 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ом.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2014, 09:27     Может ли объект-член, или объект-элемент достучаться к содержащему его?
Посмотрите здесь:

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

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

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

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

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

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

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

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

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

Добавлено через 51 секунду
taras atavin, какие то слишком хитрые Вы решения придумываете, может осветить проблему, что бы попробовать найти другой подход к ее решению ?
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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;
 ...
}
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 12:00  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #8
Цитата Сообщение от Ilot Посмотреть сообщение
Нигде пока вы не выделите для него память или не объявите в тексте программы.
Пока для b1 не выделена память, его члены вообще не могут быть созданы, но по условию член b1 класса A уже существует, вызван его метод и этот метод что то делает.

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

Добавлено через 6 минут
Цитата Сообщение от aLarman Посмотреть сообщение
taras atavin, какие то слишком хитрые Вы решения придумываете, может осветить проблему, что бы попробовать найти другой подход к ее решению ?
Очень хорошо. Значит в разделе, посвящённом указателю parent можно писать полную отсебятину?
somebdy
7 / 7 / 1
Регистрация: 30.04.2013
Сообщений: 25
14.03.2014, 12:02     Может ли объект-член, или объект-элемент достучаться к содержащему его? #9
Цитата Сообщение от taras atavin Посмотреть сообщение
И где это я помянул protected?
У вас не наследование. Класс A дружественный классу B хоть как имеет доступ к закрытым членам класса B.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 12:04  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #10
Цитата Сообщение от somebdy Посмотреть сообщение
A дружественный классу B хоть как имеет доступ к закрытым членам класса B.
Ключевое слово здесь - прилагательное "закрытым". Где я помянул protected?
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
14.03.2014, 12:06     Может ли объект-член, или объект-элемент достучаться к содержащему его? #11
Цитата Сообщение от taras atavin Посмотреть сообщение
Где я помянул protected?
По умолчанию поля класса имеют спецификатор доступа private.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 12:09  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #12
Цитата Сообщение от Ilot Посмотреть сообщение
По умолчанию поля класса имеют спецификатор доступа private.
И явно указать иное, конечно же, нельзя.
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
14.03.2014, 12:11     Может ли объект-член, или объект-элемент достучаться к содержащему его? #13
Цитата Сообщение от taras atavin Посмотреть сообщение
И явно указать иное, конечно же, нельзя.
Можно, но вы же этого не сделали. Вы описали свои классы и я должен был догадаться, что за многоточием скрывается спецификатор public?
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 12:17  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #14
Эйси. Но ведь доступ к членам другого класса рассматривается не в сферическом вакууме, а применительно к случаю агрегации объектов. Какое отношение спецификаторы имеют к данному аспекту? И я ведь ещё специально помянул место нахождения в памяти объекта, владеющего вызываемыми методами. А спецификаторы за 13 то лет можно и выучить. Вниз доступ при агрегации проблем не вызывает, так как методы B уж точно знают смещения полей, а метод C кроме того знаком со значением индекса. А вверх?
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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;
};
Стоит заметить ,что у этого есть свои ограничения. Например, в конструкторах и деструкторах таких классов нельзя обращаться к данным родителя. Т.к. они могут быть либо еще не созданы, либо уже уничтожены. Собственно поэтому подобная фича не доступна по умолчанию.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 13:35  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #16
Цитата Сообщение от 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);
, адреса агрегирующих объектов могут в этот момент поменяться.
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
14.03.2014, 13:39     Может ли объект-член, или объект-элемент достучаться к содержащему его? #17
realloc вроде копирует, не должны, вот только тогда в агрегирующем классе могут слететь ссылки на агрегированные объекты
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 13:40  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #18
Цитата Сообщение от DrOffset Посмотреть сообщение
Стоит заметить ,что у этого есть свои ограничения. Например, в конструкторах и деструкторах таких классов нельзя обращаться к данным родителя. Т.к. они могут быть либо еще не созданы, либо уже уничтожены. Собственно поэтому подобная фича не доступна по умолчанию.
Уже инициализируется агрегированный объект, а агрегирующего ещё нет. Очень интересно. Или для агрегированный ещё не удалялся, а агрегирующий уже удалён. Также весело.

Добавлено через 1 минуту
Цитата Сообщение от aLarman Посмотреть сообщение
realloc вроде копирует, не должны, вот только тогда в агрегирующем классе могут слететь ссылки на агрегированные объекты
Какого они слетят? Все внутриобъектные смещения константы в пределах класса.
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
14.03.2014, 14:08     Может ли объект-член, или объект-элемент достучаться к содержащему его? #19
Цитата Сообщение от 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 типы в С++ в принципе не очень хорошая идея.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2014, 17:25     Может ли объект-член, или объект-элемент достучаться к содержащему его?
Еще ссылки по теме:

компилятор считает объект l-value, но объект таковым не является - C++
итак есть базовый абстрактный класс Дерево, есть два его наследника Плодовое Дерево и Лесное Дерево. Также существует класс Контейнер...

Один объект не может дополнить другой - C++
Есть два объекта,принадлежащие этому классу. #include &quot;value_class.h&quot; class Variable { private: ...

Указатель объект на объект (фикс ошибки) - C++
/*Есть некий объект ObjectOne который содержит в private: такую строку*/ ObjectTwo *obj = new ObjectTwo(); /*При выводе на экран...

Объект удаляется до возвращения его из функции - C++
Есть следующий код перегрузки операции &quot;+&quot; для сложения матриц: Matrix operator+(const Matrix &amp;x) { Matrix result(*this); ...

Как объявить объект класса, не создавая его? - C++
Нужно объявить объект класса, но чтобы при этом не вызывался конструктор? Просто потом хочу его создать через конструктор копирования....


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

Или воспользуйтесь поиском по форуму:
Alex5
1048 / 711 / 104
Регистрация: 12.04.2010
Сообщений: 1,789
14.03.2014, 17:25     Может ли объект-член, или объект-элемент достучаться к содержащему его? #20
Пример с использованием указателей на члены класса. (Возможно, не будет работать для любого компилятора.)
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;
 
    // ... 
}
Миниатюры
Может ли объект-член, или объект-элемент достучаться к содержащему его?  
Yandex
Объявления
14.03.2014, 17:25     Может ли объект-член, или объект-элемент достучаться к содержащему его?
Ответ Создать тему
Опции темы

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