C++ 插入构造函数中的优先级队列

C++ 插入构造函数中的优先级队列,c++,C++,我想创建一个名为Edge的对象,它将自己从构造函数插入到优先级队列中。就是, Class Edge { int m_from; int m_to; int m_cost; public: edge(from, to, cost) : m_from(from), m_to(to), m_cost(cost) { edges.push(this); } 困难在于通常的鸡对蛋问题。边是边的优先级队列,因此它需要知道边是什么。另外,对于边缘,它需要有小于重载的运算符

我想创建一个名为Edge的对象,它将自己从构造函数插入到优先级队列中。就是,

Class Edge {
   int m_from;
   int m_to;
   int m_cost;
public:
   edge(from, to, cost) : m_from(from), m_to(to), m_cost(cost) {
      edges.push(this);
}
困难在于通常的鸡对蛋问题。边是边的优先级队列,因此它需要知道边是什么。另外,对于边缘,它需要有小于重载的运算符,因此在我可以实例化优先级队列之前,需要定义运算符,但不能定义它,因为边缘尚未定义。我试过很多不同的方法,但都不管用。当然,我可以在调用构造函数的代码中插入边缘

edges.push(Edge(from,to,cost));
但似乎应该有一种方法来实施这一点。基本上,我是说这些对象在创建时需要进入优先级队列,所以让我们保证这会发生

/*In.h*/
/* In .h*/

class Edge {
    int m_from;
    int m_to;
    int m_cost;
    static priority_queue<Edge*> edges;        
public:
    Edge(from, to, cost) : m_from(from), m_to(to), m_cost(cost) {
        edges.push(this);
    }
}

bool operator < (const Edge* first, const Edge* second) { return first->m_cost < second->m_cost; }

/*In .cpp */
priority_queue<Edge*> Edge::edges;
阶级边缘{ int m_from; int m_to; 国际货币单位成本; 静态优先级队列边缘; 公众: 边缘(从,到,成本):m_从(从),m_到(到),m_成本(成本){ 推(这个); } } 布尔运算符<(常数边*第一,常数边*第二){返回第一->m_成本<第二->m_成本;} /*In.cpp*/ 优先级队列边缘::边缘;
这不是未定义的行为吗?当您将对象插入队列时,它没有完全构造好。显式push()对我来说已经足够好了。如果要强制执行,请将优先级队列和边构造都放在包装器中,从而隐藏它们。也许最好使用另一个类来创建边,该类将边放在集合中,然后将指针交还给您。(这是工厂模式吗?)Manu343726,我明白你的意思。除此之外,这意味着“this”在构造函数中永远不可用。您仍然需要在边缘上重载小于运算符,否则优先级将基于指针地址而不是成本。你应该修改你的答案来显示这一点。这个主意不错,但正如皮平指出的,你需要重载指针比较,而事实证明,这是不可能的;错误:“bool运算符如何将优先级队列转换为std::vector并在插入后对其排序?或者您只需提供自己的比较器--
priority\u队列
不限于
operatorFerdinand-可能。我试图定义一个比较函数,但遇到了同样的问题,即鸡对蛋。但如果我先声明Edge,比较(const-Edge*,const-Edge*)可能会起作用。我试试看。