On 09/24/2010 02:42 PM, Simon W wrote:
Hey, sorry for the lacking information.

May I declare it as this instead:

C++ Class
class GameObjectManager
{
     map<GameObject*, Data> a_map; // this map has "nothing" to do with
python dict
    GameObject* createGameObject(id)
    {
       Gameobject* obj = new Gameobject(id);
       a_map[ obj ] = ...some data...
       return obj;
     }


    callPython()
   {
       // get game object from map
       obj = a_map.getgameobject()

boost::python::get_override("callbackFunction")(boost::python::object(boost::python::ptr(obj)));
   }

}; // end of class

The python class:


class myRandomClass:
    def __init(self, the_c++_GameobjectManager_pointer):
      self.manager = the_c++_GameobjectManager_pointer
      gameobject = self.manager.createGameObject(1)
#self.manager.createGameObject() returns a pointer to the gameobject
created in c++
      self.mylist[gameobject] = ..some data..

    def callPython(self, gameobj): # at some point, c++ will call this
function and pass the game object we created above with id 1
     for x in self.mylist.keys():
       print(x == gameobj)         # True
       print(gameobj in mylist)    # False

So basically the c++ class and python class have their own dict but I
want them to have the *same *address value in their keys .. is it possible??

It seems, in c++ the key is the address of the game object and in Python
it some other address (but they basically point to the same
object/memory). Is there any way around this _without_ changing the type
of the key being used, i.e. keep the key as a pointer.


You need to define __eq__, __ne__ and __hash__ in Python in such a way that they compare the C++ pointers for equality. You can do this by writing free functions that take a GameObject* as their first argument, and wrapping them as Python methods with those special names.

That should be all you need to do.

Be aware that defining __hash__ also tells Python that you promise that it's return value is an immutable property of the Python object - i.e. the same Python object should never be changed to point to a different C++ object (this is hard to do accidentally anyhow in Boost.Python).

Jim






On Fri, Sep 24, 2010 at 4:27 PM, Stefan Seefeld <seef...@sympatico.ca
<mailto:seef...@sympatico.ca>> wrote:

      Simon,

    I don't quite understand what you are trying to do. Please provide a
    little more detail. Your current mail requires far too much
    second-guessing to be useful.


    On 09/24/2010 10:08 AM, Simon W wrote:

        Hi,

        Im really scared because I fear a fundamental issue concerning
        the script system in my game engine.


        In C++, I have a class. In my class I map data to GameObject like:

        *class
        {
            map<GameObject*, Data> .....
        }*


    OK. (Naming this class would help the discussion, though.)


        As you see, I use the pointer as key.

        When I from c++, in the same class, call a python function I
        pass the key like this:

        *class::callPythonFunctions()
        {

        
boost::python::get_override("callbackFunction")(boost::python::object(boost::python::ptr(gameobject)));
        // the variable /gameobj /is of type GameObject*
        }
        *


    OK.


        When I recieve the call in python I do some checks like this:

        *def callbackFunction(self, gameobj):
           for x in self.mydict.keys():
             print("Checking")
             print(gameobj == self.mydict)
             print(gameobj in self.mydict)*


    This looks wrong. You iterate over 'x', but don't use it in the
    loop. May I assume that 'mydict' relates to the above
    map<GameObject*, Data> in the unnamed class ?



        The above will print something like:
        /....
        Checking
        True
        False
        .../


    This suggests that 'gameobj' compares equal to the 'mydict' object,
    but that it is not itself included in the sequence returned by
    mydict.keys().




        I do have a overloaded == operator. But how can I fix so that
        python checks for my pointer and not the PyObject* pointer ?


    What type do you consider providing an operator== for ?

        Stefan


    --

          ...ich hab' noch einen Koffer in Berlin...

    _______________________________________________
    Cplusplus-sig mailing list
    Cplusplus-sig@python.org <mailto:Cplusplus-sig@python.org>
    http://mail.python.org/mailman/listinfo/cplusplus-sig




_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to