繁体   English   中英

在boost.python中使用抽象类时无法使用纯虚函数

[英]Cannot use pure virtual functions in my abstract class when using it in boost.python

我正在尝试使用我的C ++库扩展Python,并且在这种特殊情况下遇到了一些问题:假设有一个名为Shape的抽象类,现在我想允许Python从Shape继承并基本上实现其自己的Shape ,但还可以在C ++代码中使用Shape的某些现有实现。 让我显示一些代码:

class Shape {
public:
    virtual inline double get_area() const = 0;
};

太好了,现在我们说有一个名为Circle的C ++类。

class Circle : public Shape {
public:
    Circle() = default;
    inline double get_area() const override { return 0.5; }
}

好的,让我们为Shape (版本1)编写一个包装器:

struct ShapeWrap : public Shape, public wrapper<Shape>{
   inline double get_area() const override {
      if (auto py_func = this->get_override("get")) return py_func();
      return Shape::get_area();
   }
   inline double default_get_area() const {
      return this->Shape::get_area();
   }
};

然后以这种方式定义Shape:

class_<ShapeWrap, boost::noncopyable>("Shape")
        .def("get_area", &Shape::get_area, &ShapeWrap::default_get_area));

好的,现在这是一个问题,因为Shape是一个抽象类,并且理所当然地,它没有实现get_area (它是纯虚拟的)。 好吧,我们如何将所有这些抓取并以这种方式编写呢?

struct ShapeWrap : public Shape, public wrapper<Shape>{
   inline double get_area() const override {
      if (auto py_func = this->get_override("get")) return py_func();
      return 0.0;
   }
};

然后像这样定义Shape

class_<ShapeWrap, boost::noncopyable>("Shape")
        .def("get_area", pure_virtual(&ShapeWrap::get_area));

好的,这对于Python覆盖的对象来说效果很好。 但是,如果我在Python中创建Circle对象,则会出现以下错误:

Boost.Python.ArgumentError: Python argument types in
    Shape.get_area(Circle)
did not match C++ signature:
    get_area(ShapeWrap {lvalue})
    get_area(ShapeWrap {lvalue})

现在,如果我在Shape类中使get_area返回0.0作为默认行为,但是如果我不想仅以支持Python的方式编写API,则所有这些问题都将得到解决,我想为当函数不可用并仅对Python返回0.0时,因为抽象类的概念在Python中不存在,这很好,但是接下来我将把Shape作为其余部分的抽象类C ++ API。 有什么办法吗?

感谢@llonesmiz,我意识到问题在于将包装器函数传递给了纯虚函数。 ShapeWrapper这种方式定义ShapeWrapper可以解决此问题:

class_<ShapeWrap, boost::noncopyable>("Shape")
    .def("get_area", pure_virtual(&Shape::get_area));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM