gpt4 book ai didi

python - C++ Python Boost 中的友元函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:21:57 25 4
gpt4 key购买 nike

我想使用 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 的文档似乎也没有(或者至少我没有看到关于友元函数的说明)。非常感谢任何帮助。

最佳答案

只看这段代码,不清楚为什么首先将函数声明为 friend

friend 关键字用于向编译器指示给定函数或类能够访问为其定义的类的私有(private)和 protected 成员。friend 函数不是类的成员。

当您绑定(bind)您的函数时,您指定,例如,&Turtle::GetLeft 作为指向您希望绑定(bind)的函数的指针。然而,GetLeft 不是 Turtle 的成员,它只是一个友元函数。

查看您的绑定(bind),您要做的是创建函数,例如 GetHeading/GetLeft 公共(public)成员函数

因此,我假设你有这样的东西:

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
}
// ...
};

一旦您将函数重写为公共(public)成员函数而不是 friend 非成员函数,您将能够像上面那样绑定(bind)它们。

可能值得注意的是,谨慎使用 friend 是一种很好的做法。如果使用不当,它会破坏类的封装。看看When should you use 'friend' in C++?

关于python - C++ Python Boost 中的友元函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24779650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com