[C++-sig] Static, again...
Hugo van der Merwe
hugo at adept.co.za
Tue Nov 12 11:07:24 CET 2002
I had a look at the mailing list archives about this topic, I'm still
not clear on how exactly it works:
> #include <boost/python/module.hpp>
> #include <boost/python/class.hpp>
>
> struct Num {
> Num() {}
> ~Num() {}
> static int getDims() {return 3;}
> int dims() {return 5;}
> };
>
> BOOST_PYTHON_MODULE_INIT(numTest)
> {
> using namespace boost::python;
> module numTestMod("numTest");
> numTestMod
> .add
> ( class_<Num>("Num")
> .def_init()
> .def("getDims",&Num::getDims)
> .def("dims", &Num::dims)
> )
> ;
> }
> We don't have a way to make true static methods yet.
> getDims will work fine if you access it through the class like this:
>
> Nums.getDims()
I am trying to wrap a "Settings" class which does not have a public
constructor, it expects you to call "GetInstance" to get a pointer to
the always-existing instance (making the settings "global"). The above
would make me think that this will work:
class_<Settings, boost::noncopyable>("Settings", no_init)
.def("GetInstance", &Settings::GetInstance,
return_value_policy<reference_existing_object>());
I cannot call Settings.GetInstance(), it gives me:
TypeError: unbound method Boost.Python.function object must be called with Settings instance as first argument (got nothing instead)
I also read about an approach that looks something like this:
object settings_class =
class_<Settings, boost::noncopyable>("Settings", no_init);
settings_class.attr("Settings") = &Settings::GetInstance;
But I don't know how that is supposed to work...
If I wanted to expose GetInstance as Settings() instead (once I get it
working), is it as simple as just calling it "__init__" instead?
(Should I then have no_init in the class_<> invocation or not? I
noticed the tutorial talks about no_init, but then mentions as soon as
you wish to derive classes from it, you do not want no_init. So when
is no_init useful? Only when you cannot construct a class and don't
want to derive from it, i.e. when you're using "factories"?)
I am really astonished with what can be achieved with C++ -
Boost.Python is really amazing!
Thanks a lot,
Hugo van der Merwe
More information about the Cplusplus-sig
mailing list