我可以用我自己的类包装boost graph吗?

Can I wrap boost graph with my own class

本文关键字:boost graph 包装 我自己 自己的 我可以      更新时间:2023-10-16

我试图用boost::adjacency_matrix graph作为成员创建自己的类,但我被困在编译错误上。不能编译的样例类:

namespace zto {
typedef boost::adjacency_matrix<boost::undirectedS> Graph;
class SampleClass
{
public:
    Graph g;
    SampleClass();
};

编译错误:

./src/sample.cpp: In constructor ‘zto::SampleClass::SampleClass()’:
./src/sample.cpp:27:31: error: no matching function for call to 
  ‘boost::adjacency_matrix<boost::undirectedS>::adjacency_matrix()’
./src/sample.cpp:27:31: note: candidates are:
/usr/include/boost/graph/adjacency_matrix.hpp:622:5: note: template<class EdgeIterator, 
  class EdgePropertyIterator> boost::adjacency_matrix::adjacency_matrix(EdgeIterator, 
  EdgeIterator, EdgePropertyIterator, boost::adjacency_matrix<Directed, VertexProperty, 
  EdgeProperty, GraphProperty, Allocator>::vertices_size_type, const GraphProperty&)
/usr/include/boost/graph/adjacency_matrix.hpp:604:5: note: template<class EdgeIterator> 
  boost::adjacency_matrix::adjacency_matrix(EdgeIterator, EdgeIterator, 
  boost::adjacency_matrix<Directed, VertexProperty, EdgeProperty, GraphProperty, 
  Allocator>::vertices_size_type, const GraphProperty&)
/usr/include/boost/graph/adjacency_matrix.hpp:593:5: note: 
  boost::adjacency_matrix<Directed, VertexProperty, EdgeProperty, GraphProperty, 
  Allocator>::adjacency_matrix(boost::adjacency_matrix<Directed, VertexProperty, 
  EdgeProperty, GraphProperty, Allocator>::vertices_size_type, const GraphProperty&) 
  [with Directed = boost::undirectedS, VertexProperty = boost::no_property, EdgeProperty 
  = boost::no_property, GraphProperty = boost::no_property, Allocator = 
  std::allocator<bool>, boost::adjacency_matrix<Directed, VertexProperty, EdgeProperty, 
  GraphProperty, Allocator>::vertices_size_type = unsigned int]
/usr/include/boost/graph/adjacency_matrix.hpp:593:5: note:   candidate expects 2 
  arguments, 0 provided
/usr/include/boost/graph/adjacency_matrix.hpp:474:9: note: 
  boost::adjacency_matrix<boost::undirectedS>::adjacency_matrix(const 
  boost::adjacency_matrix<boost::undirectedS>&)
/usr/include/boost/graph/adjacency_matrix.hpp:474:9: note:   candidate expects 1 
  argument, 0 provided

看起来编译器认为Graph是一个函数?

谁能告诉我,如何声明boost::adjacency_matrix作为我的类的成员?

如果不指定任何其他初始化器,则使用默认构造函数初始化类的对象成员。似乎邻接ency_matrix没有默认构造函数

你应该这样做:

typepedef boost::adjacency_matrix;

class SampleClass
{
public:
    Graph g;
    SampleClass(size_t arg)
    : g(arg) // this is important
    {
      // As before, can also be in a cpp. 
      // It is just important that the initializer is used.
    }
};
当然,在实践中你也可以使用其他构造函数参数,使用你赢得的默认值,等等。这应该是一个非常简单的例子。我从来没有使用过boost::adjecency_matrix,所以我不知道什么是好的实践,什么是有意义的。

编译器告诉你boost::adjacency_matrix没有一个不带参数的构造函数,所以它不能构造一个作为你的类的成员。类的对象成员必须在构造包含类的同时构造,除非您另行指定,否则编译器会假定存在一个没有参数的构造函数供其调用。如果没有,你会得到这样的错误。

解决方案是在构造函数的初始化列表中为g的构造函数提供参数:
SampleClass() : g( ... )
{
}

Where the…是一个适当的构造函数参数,用于任何一个adjacency_matrix的构造函数,该构造函数为您提供所需的对象。这将覆盖编译器尝试调用0参数构造函数的默认本能,并使其调用与您提供的参数匹配的构造函数。

如果你不想在构造类的时候这样做,你必须存储一个指向它的指针,并在适当的时候用new构造它。或者更好的是,存储一个shared_ptr,这样你就不必担心在你的类被销毁时删除它。

据我所知,Graph没有默认构造函数。

您应该提供一个参数,因此只需参考文档。