C ++: Передача ссылки конструирования объекта на построенные объекты-члены? - PullRequest
4 голосов
/ 06 мая 2011

Хорошо, рассмотрим следующие классы:

class Object
{
public:
    // Constructor
    Object() : 
        [Initialization List]
    {
        ...
    }
    ...
};

class Container
{
public:
    Object A;
    Object B;

    ....

    Container() :
        [Initialization List]
    {
    }
};

Я бы хотел предоставить [доступ к Контейнеру и его членам] к Объектам.

Моей первой мыслью было как-то передать ссылку на текущий объект-контейнер конструкторам объектов. Но я не могу понять, как это сделать.

Я возился с "этим", но я не получаю ничего, что работает. Я пробовал что-то вроде этого:

class Object
{
public:
    Container& c

    // Constructor
    Object(Container& c_) : 
        c(c_)
    {
        ...
    }
    ...
};

class Container
{
public:
    Object A;
    Object B;

    ....

    Container() :
        A(Object(this))
        B(Object(this))
    {
    }
};

Моя конечная цель - получить доступ к объекту B из метода-члена объекта A.

Кто-нибудь знает, как приблизиться к тому, что я ищу?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 06 мая 2011

не UB или необязательно использовать this в списке инициализаторов, хотя необходимо соблюдать осторожность, и ваш код совершенно корректен с незначительными изменениями.

class Container;
class Object
{
public:
    Container& c

    // Constructor
    Object(Container& c_) : 
        c(c_)
    {
    }
};

class Container
{
public:
    Object A;
    Object B;

    Container() :
        A(Object(*this))
        B(Object(*this))
    {
    }
};

this - указатель, вам нужна ссылка, и простая де-ссылка поможет.Это совершенно законный и определенный код.То, что не разрешено, - это доступ к любым данным или функциям-членам через указатель, потому что эти данные или функции-члены просто могут еще не существовать, пока не будет завершен список инициализации.Но определенно разрешено брать указатель или ссылку на объект во время его списка инициализатора и передавать его.

1 голос
/ 06 мая 2011

Как насчет использования указателей? Редактировать : исправлен код, чтобы избежать this в списке инициализатора.

class Container;

class Object
{
public:
    Container *c;

    // Constructor
    Object(Container *c_) : 
        c(c_)
    {
    }
};

class Container
{
public:
    Object *A, *B;

    Container()
    {
        A = new Object(this);
        B = new Object(this);
    }
};
0 голосов
/ 06 мая 2011

Вы не должны передавать this в инициализаторах для членов класса, чей экземпляр вы создаете, но вы можете передать его позже, так что есть два простых способа решения вашей проблемы

  • useустановщик объекта (A.setContainer(*this)) в теле конструктора
  • создает указатели A и B, инициализирует их в NULL и делает A = new Object(this) в теле конструктора
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...