Интересует, существует ли возможность как-нибудь ЭЛЕГАНТНО и без сложных извратов получить в поле какого-нить класса ссылку на объект который содержит это поле. Другими словами:
class Base
{
public:
Base* parent;
};
class A : public Base
{
public:
A(Base* ptr)
{
parent = ptr;
}
};
class B : public Base
{
public:
A member;
B() : member(this)
{
}
};
Интересует есть ли возможность избежать прямой передачи ссылки
B() : member(this)
и получить в классе А ссылку на объект-родитель неявно? Или я захотел что-то из области фантастики?
Здравствуйте, Аноним, Вы писали:
А> Интересует, существует ли возможность как-нибудь ЭЛЕГАНТНО и без сложных извратов получить в поле какого-нить класса ссылку на объект который содержит это поле. Другими словами:
Можно, если не забыли откуда ноги растут:
А>
class Base
{
public:
Base* parent;
};
class A : public Base
{
};
class B : public Base
{
public:
A member1;
A member2;
A member3;
//...
A memberN;
B()
{
std::fill_n((Base**)this, sizeof(*this)/sizeof(Base*), (Base*)this);
}
};
Ну а если серьёзно. Разьве просто передать указатель это не "ЭЛЕГАНТНО и без сложных извратов"? Я уверяю, что любое другое решение будет более сложным.
Здравствуйте, remark, Вы писали:
А>> Интересует, существует ли возможность как-нибудь ЭЛЕГАНТНО и без сложных извратов получить в поле какого-нить класса ссылку на объект который содержит это поле. Другими словами:
R>Можно, если не забыли откуда ноги растут:
А>>
R>class Base
R>{
R>public:
R> Base* parent;
R>};
R>class A : public Base
R>{
R>};
R>class B : public Base
R>{
R>public:
R> A member1;
R> A member2;
R> A member3;
R> //...
R> A memberN;
R> B()
R> {
R> std::fill_n((Base**)this, sizeof(*this)/sizeof(Base*), (Base*)this);
R> }
R>};
R>
R>Ну а если серьёзно. Разьве просто передать указатель это не "ЭЛЕГАНТНО и без сложных извратов"? Я уверяю, что любое другое решение будет более сложным.
Всё это элегантно работает пока пока в объекте-контейнере только объекты производные от Base. Как я понмаю, при появлении объекта элементарного типа int, float или виртуальной ф-ии, описанная конструкция перестаёт работать.

В Страуструпе есть приятный пример создания списка объектов производных от базового:
class Base {
Base* next;
static Base * list;
public:
Base()
{
next = list;
list = this;
}
};
кажись так...
...таким образом можно в любой момент "пройтись" по всем объектам производным от Base. А вот было бы шикарно если бы можно было бы каким-нить образом сохранить дерево объектов...