qt.go
qt.go copied to clipboard
对象的某些属性或容器返回的地址与真实的地址不相符的问题
obj0 := qtcore.NewQObject(nil)
obj1 := qtcore.NewQObject(obj0)
obj2 := qtcore.NewQObject(obj0)
fmt.Println("obj0", obj0)
fmt.Println("obj1", obj1)
fmt.Println("obj2", obj2)
fmt.Println(obj1.Parent())
// obj1, obj2
fmt.Println(qtcore.NewQObjectListxFromPointer(obj0.Children().Cthis).ConvertToSlice())
result:
obj0 &{0xc0000aa068}
obj1 &{0xc0000aa080}
obj2 &{0xc0000aa098}
// 此处应该返回的是 obj0 的地址,但是和obj0本身的地址不一样。
&{0xc000010028}
// 此处应该返回 obj1, obj2 的地址,但是和它们本身的真实地址不一样。
[0xc0000aa0d0 0xc0000aa0f8]
返回的地址不一致会造成很多不方便的问题,比如判断两个对象是否相等,等等。这种情况能否解决?
应该是封装方式造成的,用go struct封装了C++类型的指针,所以要想看到真实的指针需要多执行一步取地操作,obj.GetCthis()函数可以取到底层C++类型的指针。
在当时实现的时候曾考虑过另一种封装方式,直接使用unsafe.Pointer的别名,这样封装后的对象还是原来的C++指针。还没有测试过这种方式,不知道是否能实现现在所有的功能,只是为了保险选用了现在的struct封装方式。如果有兴趣多讨论一下,考虑一下,或者帮着试一试