是将我的shared_ptr切片的boost图

Is boost graph slicing my shared_ptr

本文关键字:切片 boost ptr 我的 shared      更新时间:2023-10-16

我正在使用带有boost::shared_ptr<Obj>的Boost图作为边缘属性的实现。我有两个ObjObj2类,因此:

class Obj{
    public:
    Obj(){};
    virtual func(){std::cout << "Obj func " << std::endl};
};
class Obj2: public Obj{
    public:
    Obj2(){};
    virtual func(){std::cout << "Obj2 func " << std::endl};
};

我使用(简化)函数在图中添加边缘,例如:

void addEdge(Vertex index, Vertex index2, const boost::shared_ptr<Obj>& edgeAttribute){
    out = boost::add_edge(index, index2, edgeAttribute, graph).first;
}

我使用:

称呼:
Obj2* obj = new Obj2();
boost::shared_ptr<Obj2> obj_ptr(obj);
addEdge(index, index2, obj_ptr);

但是,在我的代码中稍后通过执行edgeAttr = graph[edge]拾取边缘属性,然后调用函数edgeAttr->func(),我称obj的func而不是OBJ2。

。 据我了解,

这意味着我的物体被切成薄片。我给出的一个简短示例应该在使用Boost时切成我的对象:shared_ptr和bgl,还是我自己的其他实现问题(例如初始化)?

no图形模型不会切成任何属性(请注意,"属性"实际上称为捆绑属性)。

实际上,它永远不会复制 ObjObj2,因为它只是复制了shared_ptr<>,而不是复制共享所有权,而不是复制属性。

让我们演示它的工作原理

活在coliru

#include <boost/graph/adjacency_list.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
#include <iostream>
class Obj {
  public:
    Obj(){};
    virtual void func(std::ostream& os) { os << "Obj  funcn"; };
};
class Obj2 : public Obj {
  public:
    Obj2(){};
    virtual void func(std::ostream& os) { os << "Obj2 funcn"; };
};
// I'm adding edges in the graph using a (simplified) function such as:
using Graph = boost::adjacency_list<boost::vecS, boost::vecS,
      boost::directedS, boost::no_property, boost::shared_ptr<Obj> >;
using Vertex = Graph::vertex_descriptor;
struct Program {
    Program() : _graph(10) {}
    void addEdge(Vertex index, Vertex index2, const boost::shared_ptr<Obj> &edgeAttribute) {
        auto out = boost::add_edge(index, index2, edgeAttribute, _graph).first;
    }
    void sample_edges() {
        Obj2 *obj = new Obj2();
        boost::shared_ptr<Obj2> obj_ptr(obj);
        addEdge(1, 2, boost::make_shared<Obj2>());
        addEdge(2, 3, boost::make_shared<Obj >());
        addEdge(3, 4, boost::make_shared<Obj2>());
        addEdge(4, 5, boost::make_shared<Obj >());
        addEdge(5, 6, boost::make_shared<Obj2>());
        addEdge(6, 7, boost::make_shared<Obj >());
    }
    void debug_dump() const {
        for (auto ed : boost::make_iterator_range(boost::edges(_graph))) {
            _graph[ed]->func(std::cout << "Edge " << ed << ": ");
        }
    }
  private:
    Graph _graph;
};
int main() {
    std::cout << "Demo edges:n";
    Program demo;
    demo.sample_edges();
    demo.debug_dump();
    std::cout << "Copied edges:n";
    // copy the whole shebang
    Program clone = demo;
    clone.debug_dump();
}

打印:

Demo edges:
Edge (1,2): Obj2 func
Edge (2,3): Obj  func
Edge (3,4): Obj2 func
Edge (4,5): Obj  func
Edge (5,6): Obj2 func
Edge (6,7): Obj  func
Copied edges:
Edge (1,2): Obj2 func
Edge (2,3): Obj  func
Edge (3,4): Obj2 func
Edge (4,5): Obj  func
Edge (5,6): Obj2 func
Edge (6,7): Obj  func