Получить неявно ссылку на объект контейнер
От: Аноним  
Дата: 22.08.06 20:27
Оценка:
Интересует, существует ли возможность как-нибудь ЭЛЕГАНТНО и без сложных извратов получить в поле какого-нить класса ссылку на объект который содержит это поле. Другими словами:


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)


и получить в классе А ссылку на объект-родитель неявно? Или я захотел что-то из области фантастики?
Re: Получить неявно ссылку на объект контейнер
От: remark Россия http://www.1024cores.net/
Дата: 22.08.06 20:42
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Интересует, существует ли возможность как-нибудь ЭЛЕГАНТНО и без сложных извратов получить в поле какого-нить класса ссылку на объект который содержит это поле. Другими словами:



Можно, если не забыли откуда ноги растут:

А>

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);
    }
};





Ну а если серьёзно. Разьве просто передать указатель это не "ЭЛЕГАНТНО и без сложных извратов"? Я уверяю, что любое другое решение будет более сложным.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Получить неявно ссылку на объект контейнер
От: xander.od  
Дата: 24.08.06 20:49
Оценка:
Здравствуйте, 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. А вот было бы шикарно если бы можно было бы каким-нить образом сохранить дерево объектов...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.