Можете ли вы иметь ссылку на член std :: shared_ptr < variable > в том же объекте?

Из этот вопрос - добавьте следующие стили в таблицу стилей только для печати. Это решение будет работать в IE и Firefox, но не в Chrome (начиная с версии 21):

#header {
  display: table-header-group;
}

#main {
  display: table-row-group;
}

#footer {
  display: table-footer-group;
}

1
задан karel 29 March 2019 в 10:43
поделиться

1 ответ

Я не уверен, чего на самом деле намеревается достичь ОП.

Я бы искал другой дизайн, потому что подход OP кажется мне хрупким и склонным ломаться с наименьшим изменением исходного кода.

Однако, настоящая ошибка OP - ИМХО неправильная инициализация в конструкторе:

Ссылка должна быть взята после инициализации общего указателя. Кроме того, я делаю общий указатель const, чтобы подчеркнуть, что он сломается (ссылка станет висячей), как только общий указатель будет переназначен. (const делает такую ​​попытку ошибкой компилятора.)

Взятие ссылки на pointee (независимо от того, указано ли это необработанным или умным указателем) должно быть сделано осторожно с учетом времени жизни pointee. , Ссылка в C ++ не делает этого сама - ndash; это ответственность автора.

Фиксированный пример OP:

#include <memory>
#include <iostream>

struct SomeOtherClass {
  int member;
  explicit SomeOtherClass(int initArg = 0): member(initArg) { }
  void whatever() { std::cout << "SomeOtherClass::member: " << member << '\n'; }
};

class SomeClass {
  public:
    explicit SomeClass(int argForOther);
    SomeClass(const SomeClass&) = delete;
    SomeClass& operator=(const SomeClass&) = delete;
    void someOtherFunction();
  private:
    const std::shared_ptr<SomeOtherClass> MemberObject;
    SomeOtherClass &MemberObjectReference;
};

SomeClass::SomeClass(int argForOther):
  MemberObject(std::make_shared<SomeOtherClass>(argForOther)),
  MemberObjectReference(*MemberObject)
{ }

void SomeClass::someOtherFunction()
{
    MemberObjectReference.whatever(); // Segmentation fault fixed
}

int main()
{
  SomeClass someClass(123);
  someClass.someOtherFunction();
  return 0;
}

Вывод:

SomeOtherClass::member: 123

Живая демоверсия на coliru

0
ответ дан Scheff 29 March 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: