Инициализация члена данных экземпляра структуры в конструкторе? - PullRequest
0 голосов
/ 02 июня 2011

У меня есть класс c ++, который в качестве частного члена данных имеет определенную структуру:

Class example {

...

private:
   struct Impl;
   Impl& structure_;
};

Предполагая, что структура Impl определяется следующим образом:

struct example::Impl{
    int m1;
    int m2;
    int m3;
};

как бы я мог инициализировать экземпляр структуры (struct_) в конструкторе класса?

Прямо сейчас у меня есть:

example::example() :
     structure_ .m1(00),
     structure_ .m2(00),
     structure_ .m3(00) {
...
}

.. для списка инициализации, но я получаю эту ошибку:

'example :: structure_': должен быть инициализирован в базе конструктора / инициализаторе члена

как бы это исправить?

Спасибо

Ответы [ 4 ]

1 голос
/ 02 июня 2011

Поскольку ваша структура_ является ссылкой, на нее должно ссылаться что-то, созданное вне вашего "примера" класса. Вы можете либо изменить ссылку на указатель и как-то выделить структуру, либо определить структуру в определении класса, что позволит вам создавать ее экземпляр напрямую вместо использования ссылки.

1 голос
/ 02 июня 2011

Если вы собираетесь использовать идиому pImpl, используйте указатель и выделите + освободите его в классе, а затем присвойте ему внутри ctor.

Class example {

...

private:
   struct Impl;
   Impl* pimpl_
};

example::example() :
     pimpl_(new Impl())
{
  pimpl_->m1 = 00;
  pimpl_->m2 = 00;
  pimpl_->m3 = 00;
...
}

example::~example(){
  delete pimpl_;
}

Если вы действительно хотите ссылку,разыменовать возвращенный указатель от new и снова взять его адрес при удалении:

example::example() : impl_(*new Impl(), ...

example::~example(){ delete &impl_; }
1 голос
/ 02 июня 2011

Impl является ссылкой, поэтому вам нужно инициализировать его с фактическим объектом Impl, прежде чем его можно будет использовать.

0 голосов
/ 02 июня 2011

Вы сохраняете свою структуру по ссылке в своем классе.Ссылка должна указывать на физический объект, вы можете сделать две вещи.Сохранить объект по значению или по указателю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...