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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 09:27     Может ли объект-член, или объект-элемент достучаться к содержащему его? #1
Предположим,
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++
Объект osteram& или как его вывести в переменную ? C++
Реализовать двухсвязный список. Каждый элемент списка может содержать один объект C++
интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
14.03.2014, 09:53     Может ли объект-член, или объект-элемент достучаться к содержащему его? #2
А почему нет? В классе А есть методы, которым можно передавать поля класса В. В чем проблема то?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 11:31  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #3
Цитата Сообщение от Ilot Посмотреть сообщение
В классе А есть методы, которым можно передавать поля класса В
Кто сказал, что они есть?

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

Добавлено через 51 секунду
taras atavin, какие то слишком хитрые Вы решения придумываете, может осветить проблему, что бы попробовать найти другой подход к ее решению ?
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 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
Ушёл с форума.
 Аватар для 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
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 12:04  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #10
Цитата Сообщение от somebdy Посмотреть сообщение
A дружественный классу B хоть как имеет доступ к закрытым членам класса B.
Ключевое слово здесь - прилагательное "закрытым". Где я помянул protected?
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
14.03.2014, 12:06     Может ли объект-член, или объект-элемент достучаться к содержащему его? #11
Цитата Сообщение от taras atavin Посмотреть сообщение
Где я помянул protected?
По умолчанию поля класса имеют спецификатор доступа private.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 12:09  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #12
Цитата Сообщение от Ilot Посмотреть сообщение
По умолчанию поля класса имеют спецификатор доступа private.
И явно указать иное, конечно же, нельзя.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
14.03.2014, 12:11     Может ли объект-член, или объект-элемент достучаться к содержащему его? #13
Цитата Сообщение от taras atavin Посмотреть сообщение
И явно указать иное, конечно же, нельзя.
Можно, но вы же этого не сделали. Вы описали свои классы и я должен был догадаться, что за многоточием скрывается спецификатор public?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 12:17  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #14
Эйси. Но ведь доступ к членам другого класса рассматривается не в сферическом вакууме, а применительно к случаю агрегации объектов. Какое отношение спецификаторы имеют к данному аспекту? И я ведь ещё специально помянул место нахождения в памяти объекта, владеющего вызываемыми методами. А спецификаторы за 13 то лет можно и выучить. Вниз доступ при агрегации проблем не вызывает, так как методы B уж точно знают смещения полей, а метод C кроме того знаком со значением индекса. А вверх?
DrOffset
6422 / 3796 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
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
Ушёл с форума.
 Аватар для 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
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
14.03.2014, 13:39     Может ли объект-член, или объект-элемент достучаться к содержащему его? #17
realloc вроде копирует, не должны, вот только тогда в агрегирующем классе могут слететь ссылки на агрегированные объекты
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 13:40  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #18
Цитата Сообщение от DrOffset Посмотреть сообщение
Стоит заметить ,что у этого есть свои ограничения. Например, в конструкторах и деструкторах таких классов нельзя обращаться к данным родителя. Т.к. они могут быть либо еще не созданы, либо уже уничтожены. Собственно поэтому подобная фича не доступна по умолчанию.
Уже инициализируется агрегированный объект, а агрегирующего ещё нет. Очень интересно. Или для агрегированный ещё не удалялся, а агрегирующий уже удалён. Также весело.

Добавлено через 1 минуту
Цитата Сообщение от aLarman Посмотреть сообщение
realloc вроде копирует, не должны, вот только тогда в агрегирующем классе могут слететь ссылки на агрегированные объекты
Какого они слетят? Все внутриобъектные смещения константы в пределах класса.
DrOffset
6422 / 3796 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
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++ Как достать объект-контейнер, а не его элемент
Если объект константный, означает ли это, что ни один его член-элемент или член-метод не изменится? C++

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

Или воспользуйтесь поиском по форуму:
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,551
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     Может ли объект-член, или объект-элемент достучаться к содержащему его?
Ответ Создать тему
Опции темы

Текущее время: 02:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru