python - 用于创建/维护外部结构的 C++ 构造函数链接
问题描述
我正在尝试使用 python Ctypes 来连接我提供的 C++ 类。在读/写成员数据和调用方法方面,我已经完成了大部分工作。但是我试图锻炼的课程(称之为 ClassA)依赖于一个外部课程(称之为 classB)。看:
//main.cc This is existing caller code. everything is c++ so using it is easy
include "ClassA.hh"
include "ClassB.hh"
void main() {
ClassB objB(x,y,z);
ClassA objA(a,b, &objB);
objA.DoStuff();
}
但是我还没有准备好通过ctypes在python中绑定和公开classB。没用过ctypes的,基本都是写一些C绑定,用python调用。A 类绑定可能如下所示:
//at the bottom of ClassA.hh
extern "C" {
ClassA* ObjaNew(int x, int y) { return new ClassA(x,y);}
void ObjaDoStuff(ClassA* objPtr) { objPtr->DoStuff();}
}
然后python中的调用代码可能看起来像
mylib = ctypes.cdll('mylib.so')
myPyObj = mylib.ObjaNew(5,6) // executes ObjaNew
mylib.ObjaDoStuff(myPyObj) // executes ObjaDoStuff
重要的一点是 python ctypes 仅支持 native-ish c 类型。通过 Ctypes 接口创建、传递或获取类或结构或 std::vector 是可行的。例如:此链接是需要编写才能分配 c++ 向量的代码:https ://stackoverflow.com/a/16887455/2312509
所以,我想我想做的是:
//classA.hh
class ClassA{
public:
ClassA(int a, int b, ClassB* p_objb) { //This is the existing constructor
; //whatever
m_objb = p_objb;
}
ClassA(int a, int b) { // This is my new constructor
ClassB *objB = new ClassB(x,y,z);
ClassA(a,b,objB);
}
我已经完成了它并且它可以编译,但我实际上还不能运行它。我担心的是 objB 被释放了,因为我看不到它是一个成员,尽管它是在构造函数的主体中分配的。我觉得如果对 new 的调用被分配给成员数据指针这是正确的,因为它是这样工作的,但是分配给本地指针,然后传递本地指针可能会失败。
我想我可以创建一个继承自两者的子类,例如:
ClassAB: public b():public a(){
//But the A constructor still would need to NOT rely on the existence of ObjB
m_objb = &this;
}
我没有写一大堆 C++,所以我不知道正确的答案是什么,但我觉得这不是一个新的或新颖的概念。
解决方案
所以,我现在似乎正在运行的是一个瘦接口类:
//classAInterface.cc
#include "classA.hh" // These are unchanged
#include "classB.hh"
class ClassAInterface {
public:
ClassAInterface(int a, int b);
ClassB *m_objb;
ClassA *m_obja;
};
ClassAInterface(int a, int b){
m_objb = new ClassB();
m_obja = new ClassA(a,b,m_objb);
}
extern "C" {
ClassAInterface* ObjaNew(int x, int y) { return new ClassAInterface(x,y);}
void ObjaDoStuff(ClassAInterface* objIntPtr) { objIntPtr->m_obja->DoStuff();}
}
// The python is the same
mylib = ctypes.cdll('mylib.so')
myPyObj = mylib.ObjaNew(5,6) // executes ObjaNew
mylib.ObjaDoStuff(myPyObj) // executes ObjaDoStuff
这似乎正在工作,并且允许我实际上不更改我想要接口的类。它有一些缺点,因为我真正的 ClassA 依赖它的调用者来做某些事情的方式还有其他不愉快的地方。
推荐阅读
- javascript - 我可以注册但不能更进一步
- php - 在 woocommerce 中获取价格的功能面临裁员
- android - 如何将数据从 Frag B 传递到 Frag A 并在再次调用时保留 Frag A 的状态?
- node.js - 在谷歌日历 API 中访问“忙碌”数组
- angular - Angular ngSwitchCase - 具有相同值的开关
- ejabberd - 如何将 ejabberd 与 phpmyadmin 连接以将消息存储到数据库中?
- python - 有没有办法为我的挑战减少这个 Python 代码的内存?
- r - 如何在 R 中完成行名?
- javascript - 将对象键的值推送到数组中
- c - 为什么添加临界区会导致分段错误?