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_ptr
和 enable_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();
我有一个 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_ptr
和 enable_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();