C++ 将此类的智能指针追加到成员std::vector

C++ 将此类的智能指针追加到成员std::vector,c++,vector,smart-pointers,C++,Vector,Smart Pointers,我有这个密码 #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::vec

我有这个密码

#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;
}
#包括
#包括
#包括
使用名称空间std;
类Foo:public std::从\u中启用\u共享\u{
公众:
Foo(){list_uu.push_back(shared_from_this());}
私人:
静态std::向量列表;
};
std::vector Foo::list;
int main(){
福福;
不能

Foo f;
在堆栈上创建实例,不允许使用指向堆栈对象的共享指针

第二件事是,当构造未完成时,Foo的构造函数访问“this”指针-您会得到一个例外,即对象被删除(此处尚未构造)。(在成员中存储共享的“this”指针通常不是一个好主意)

因此,您的解决方案可能是:

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;
}
class-Foo
:public std::从\u中启用\u共享\u
{
公众:
Foo()
{
}
无效推送()
{
list_u.push_back(从_this()共享_);
}
私人:
静态std::向量列表;
};
std::vector Foo::list;
int main()
{
std::shared_ptr foo=std::make_shared();
foo->push();
返回0;
}

我不想在堆上创建对象!@sayyedmohsenzahraee如果你不想在堆上创建对象,那么为什么你需要共享指针?如果对象被自动销毁,为什么不直接在向量中存储原始指针呢?请注意,
std::enable_shared_from_this
的目的是为了。你不能从_this()调用shared_在构造函数中,因为启用\u共享\u from\u,这需要一个Foo对象来创建一个尚未创建的共享\u ptr:
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;
}