C++11 - 如何使用 shared_ptr 的向量将此对象推入 priority_queue?

C++11 - How to push this object into priority_queue with vector of shared_ptr?

我有一个 base class 和一个 priority_queue 像这样:

class base
{
   //...
   std::priority_queue<std::shared_ptr<Obj>, std::vector<std::shared_ptr<Obj>>, obj_less> obj_queue;
   //...
}

在我的 Obj class 上,我有一个方法可以将此对象推入 priority_queue:

void Obj::set ()
{
    BaseServer& myObj = BaseFactory::getBase();
    myObj.set(this); //<------ won't compile :(
}

而这个 set() 将在我的 base class:

上调用 set()
void base::set(const Obj& o)
{
    obj_queue.push(o);
}

我想使用 this,获取指向同一个 Obj 的指针,并将其推入我的 vector,在我的 priority_queue... .

但它甚至不会编译,我有点迷茫...

知道我在这里遗漏了什么吗?

myObj.set(this);

传递一个指针,但是

void base::set(const Obj& o)

需要一个对象。

void base::set(const Obj *o)
{
    obj_queue.push(*o);
}

或者

 myObj.set(*this);

你实际上不应该这样做,因为,这真的是个坏主意,只有当你在 Obj 上有原始指针而不是调用 set 函数时,你才会没有问题。您的代码想法很奇怪,但是,实际上使用 shared_ptrenable_shared_from_this.

更好
class Obj : public std::enable_shared_from_this<Obj>
{
public:
   // ...
   void set()
   {
      BaseServer& myObj = BaseFactory::getBase();
      myObj.set(std::shared_from_this()); //<------ won't compile :(
   }
};

并且 BaseServer 应该有函数 set,在 Obj 上接收 shared_ptr。当然,您应该在调用 set 的代码中使用 shared_ptr<Obj>。例如像这样的

class Obj : public std::enable_shared_from_this<Obj>
{
private:
   Obj() {}
public:
   static std::shared_ptr<Obj> create()
   {
      return std::make_shared<Obj>();
   }
   // rest code
};

// code, that calls set function
auto object = Obj::create();
object->set();