When I said “outside” I meant standalone function.
Moreover I see you’ve added property with the same functions. This won’t work.
I would recommend you to look at docs
-http://www.boost.org/doc/libs/1_55_0/libs/python/doc/tutorial/doc/html/python/exposing.html#python.constructors
Valid wrap with untouched class declaration.
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;
};
BOOST_PYTHON_MODULE(TurtleWrapper)
{
class_<Turtle>("Turtle")
;
def("GetHeading",&Turtle::GetHeading)
def("GetLeft",&Turtle::GetLeft)
}
Anyway I would recommend you not to use friend functions to get something from
private section of class. If you’ll make methods your code will be cleaner.
Working code:
#include <boost/python.hpp>
struct PV{};
struct P{};
class Turtle
{
public:
const PV& GetHeading()
{
return mHeading;
}
const PV& GetLeft()
{
return mLeft;
}
const P& GetPoint()
{
return mPoint;
}
void SetPoint(const P& p)
{
mPoint = p;
}
private:
PV mHeading, mLeft;
P mPoint;
};
using namespace boost::python;
BOOST_PYTHON_MODULE(TurtleWrapper)
{
class_<Turtle>("Turtle")
.add_property("Heading", make_function(&Turtle::GetHeading,
return_internal_reference<>()))
.add_property("Left", make_function(&Turtle::GetLeft,
return_internal_reference<>()))
.add_property("Point", make_function(&Turtle::GetPoint,
return_internal_reference<>()), &Turtle::SetPoint)
;
}
On 18 Jul 2014, at 15:37, Kv Gopalkrishnan <[email protected]> wrote:
> Hi
> Thanks Michael For the answer however I am a bit confused about the
> solution you gave. Do you mean to remove the GetHeading function and paste it
> outside class Turtle ?
>
> Jim here is a concrete example.
>
>
> #include <iostream>
> #include <mathsym.h>
> #include <P.h>
> #include <PV.h>
>
> using namespace std;
> using namespace cxxadt;
>
>
> class Turtle{
> friend const PV& GetHeading(const Turtle& t);
> public:
>
> Turtle();
> private:
>
> PV h;
>
> };
>
> now corresponding to this the wrapper i wrote for this
> #include <iostream>
> #include <boost/python.hpp>
> #include <boost/python/module.hpp>
> #include <boost/python/def.hpp>
> #include <boost/python/scope.hpp>
> #include <boost/python/class.hpp>
> #include"Turtle.h"
> #include <mathsym.h>
>
> #include <P.h>
> #include <PV.h>
>
>
> using namespace std;
>
> using namespace boost::python;
>
> using namespace cxxadt;
>
>
>
>
> BOOST_PYTHON_MODULE(TurtleWrapper)
>
> {
>
>
>
> class_<Turtle>("Turtle")
>
> .def("GetHeading",&GetHeading) ;
>
> }
>
>
> class_<PV>("PV",init<const PV>());
>
>
> class_<P>("P",init<const P>());
>
>
> }
>
>
>
>
>
>
>
>
>
> Kind Regards
> KV
>
>
>
>
>
>
>
>
>
>
>
>
>
> On Fri, Jul 18, 2014 at 1:50 PM, Jim Bosch <[email protected]> wrote:
> On Jul 18, 2014 6:32 AM, "Kv Gopalkrishnan" <[email protected]>
> wrote:
> >
> > Hi Jim
> > Thank you for the answer. When I tried this solution
> > i.e. .def("GetHeading",&GetHeading)
> > error: ‘GetHeading’ was not declared in this scope
> >
> >
> > I get the above error.
> > Stating the obvious the error says function was not described in the
> > scope. Seems a bit nasty business is it so that I would have to write a get
> > function in someway in to public domain to get the function wrapped in to
> > boost?
> >
>
> I'm pretty sure that should have worked. Could you post a more complete
> example? I suspect the problem is elsewhere.
>
> Jim
>
> >
> > On Thu, Jul 17, 2014 at 3:12 PM, Jim Bosch <[email protected]> wrote:
> >>
> >> The problem here is actually a C++ issue, not a Boost.Python one. Friend
> >> functions aren't considered to be part of the scope of the class that
> >> they're friends with, so when referring to them, just use e.g.
> >> "&GetHeading", not "&Turtle::GetHeading".
> >>
> >> Jim
> >>
> >>
> >> On Wed, Jul 16, 2014 at 7:52 AM, Kv Gopalkrishnan
> >> <[email protected]> wrote:
> >>>
> >>> I want to expose a C++ friend functions to python using Python boost.
> >>> 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;
> >>>
> >>> };
> >>>
> >>>
> >>> Here I have wrapped the classes PV and P so no problem there. I tried to
> >>> wrap the friend functions like regular functions. Like
> >>>
> >>> 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);
> >>> }
> >>> When i run the code i get error messages.
> >>>
> >>> error: ‘GetHeading’ is not a member of ‘Turtle’
> >>> error: ‘GetLeft’ is not a member of ‘Turtle’
> >>>
> >>> This error is seen for add_property and also .def.
> >>> So I assume that this is not the way to declare a friend function and the
> >>> documentation of python boost does not seem (or at least I did not see a
> >>> note about friend functions). Any help is much appreciated.
> >>>
> >>>
> >>>
> >>> Kind Regards
> >>> K.V.
> >>>
> >>> _______________________________________________
> >>> Cplusplus-sig mailing list
> >>> [email protected]
> >>> https://mail.python.org/mailman/listinfo/cplusplus-sig
> >>
> >>
> >>
> >> _______________________________________________
> >> Cplusplus-sig mailing list
> >> [email protected]
> >> https://mail.python.org/mailman/listinfo/cplusplus-sig
> >
> >
> >
> >
> > --
> > K.V.
> >
> > _______________________________________________
> > Cplusplus-sig mailing list
> > [email protected]
> > https://mail.python.org/mailman/listinfo/cplusplus-sig
>
> _______________________________________________
> Cplusplus-sig mailing list
> [email protected]
> https://mail.python.org/mailman/listinfo/cplusplus-sig
>
>
>
> --
> K.V.
> _______________________________________________
> Cplusplus-sig mailing list
> [email protected]
> https://mail.python.org/mailman/listinfo/cplusplus-sig
_______________________________________________
Cplusplus-sig mailing list
[email protected]
https://mail.python.org/mailman/listinfo/cplusplus-sig