我想使用Python boost将C ++好友函数暴露给python。
class Turtle{
friend const PV& GetHeading(const Turtle& t);
friend const PV& GetLeft(const Turtle& t);
friend const P& GetPoint(const Turtle& t);
friend void SetPoint(Turtle& t, const P& p);
public:
...
private:
PV h;
PV l;
};
在这里,我已经将PV和P类包裹起来,所以没问题。我试图像常规函数一样包装好友函数。像
BOOST_PYTHON_MODULE(TurtleWrapper)
{
class_<Turtle>("Turtle")
.def("GetHeading",&Turtle::GetHeading)
.def("GetLeft",&Turtle::GetLeft)
.add_property("h",&Turtle::GetHeading)
.add_property("l",&Turtle::GetLeft);
}
当我运行代码时,我收到错误消息。
error: ‘GetHeading’ is not a member of ‘Turtle’
error: ‘GetLeft’ is not a member of ‘Turtle’
所以我假设这不是声明朋友函数的方法,并且python boost的文档似乎没有(或者至少我没有看到关于朋友函数的注释)。非常感谢。
答案 0 :(得分:1)
只看这段代码,不清楚为什么函数首先被声明为friend
。
friend
关键字用于向编译器指示给定的函数或类能够访问为其定义的类的私有成员和受保护成员。
friend
个函数不是类的成员。
绑定函数时,例如,指定&Turtle::GetLeft
作为指向要绑定的函数的指针。但是,GetLeft
不是Turtle
的成员,它只是一个朋友功能。
查看您的绑定,您要做的是创建诸如GetHeading / GetLeft 公共成员函数之类的函数。
因此,我认为你有这样的事情:
class Turtle {
friend const PV& GetHeading(const Turtle& t);
// ...
};
// somewhere else in your code
const PV& GetHeading(const Turtle& t) {
// getting heading here
}
我建议像这样重写:
class Turtle {
public:
// no need for friend declaration
const PV& GetHeading() const {
// move code into the class
}
// ...
};
一旦您将函数重写为公共成员函数而不是朋友非成员函数,您将能够按上述方式绑定它们。
值得注意的是,谨慎使用friend
是一种好习惯。如果使用不正确,它可能会破坏您的类的封装。看看When should you use 'friend' in C++?