добавить умный указатель этого класса к члену std :: vector - PullRequest
0 голосов
/ 25 сентября 2019

у меня есть этот код

#include <iostream>
#include <memory>
#include <vector>
using namespace std;

class Foo : public std::enable_shared_from_this<Foo> {
 public:
  Foo() { list_.push_back(shared_from_this()); }

 private:
  static std::vector<shared_ptr<Foo>> list_;
};
std::vector<shared_ptr<Foo>> Foo::list_;

int main() {
  Foo f;

  cout << "Hello World!" << endl;
  return 0;
}

, но я получаю следующую ошибку

terminate called after throwing an instance of 'std::bad_weak_ptr'
  what():  bad_weak_ptr
Press <RETURN> to close this window...

так как я могу добавить к list_ когда я создаю класс без вызова внешней функции после инициализации

1 Ответ

0 голосов
/ 25 сентября 2019

Строка

Foo f;

создает экземпляр в стеке, и общие указатели на объекты стека не допускаются.

Во-вторых, конструктор Foo обращается к «указателю»пока строительство не закончено - вы получите исключение, что объект удален (здесь еще не построено).(где хранение общих «этих» указателей в члене обычно не очень хорошая идея).

Так что решение для вас может быть:

class Foo 
  : public std::enable_shared_from_this<Foo> 
{
public:
  Foo() 
  {
  }
  void push()
  {
    list_.push_back(shared_from_this());
  }
private:
  static std::vector<shared_ptr<Foo>> list_;
};
std::vector<shared_ptr<Foo>> Foo::list_;

int main()
{
  std::shared_ptr<Foo> foo = std::make_shared<Foo>();
  foo->push();
  return 0;
}
...