gpt4 book ai didi

python - 将对象转换为指向对象的指针?

转载 作者:太空狗 更新时间:2023-10-29 21:33:42 24 4
gpt4 key购买 nike

我在 C++ 中有以下内容:

#ifndef INTERFACE_H
#define INTERFACE_H
class Interface {
public:
virtual void blah() = 0;
};
#endif

#ifndef USER_H
#define USER_H

#include "Interface.h"
#include <iostream>

class User {
public:
void callBlah(Interface* ptr) {
ptr->blah();
}
};
#endif

我有这个 SWIG 接口(interface)文件:

%module(directors="1") interface

%{
#include "Interface.h"
#include "User.h"
%}

%feature("director") Interface;
%include "Interface.h"
%include "User.h"

然后我编译了:

$ swig -Wall -c++ -python -I/usr/include/python3.6m interface.i 
Interface.h:3: Warning 514: Director base class Interface has no virtual destructor.
$ g++ -shared -fPIC -I/usr/include/python3.6m Foo.cpp interface_wrap.cxx -o _interface.so

然后,我跑了:

import interface

class Implementation(interface.Interface):
def __init__(self):
super().__init__()
self.__something = 1
def blah(self):
print("called python version")

i = Implementation().__disown__
u = interface.User()
u.callBlah(i)

它给出了:

Traceback (most recent call last):
File "test.py", line 12, in <module>
u.callBlah(i)
File "/home/foo/test/swig/interface.py", line 142, in callBlah
return _interface.User_callBlah(self, ptr)
TypeError: in method 'User_callBlah', argument 2 of type 'Interface *'

所以主要问题是变量 i 是一个实现对象(它实现了接口(interface)),但是 User::callBlah() 期望参数是一个指向接口(interface)的指针。

我的问题是如何在不更改 C++ 代码的情况下将 i 转换为指向实现/接口(interface)的指针?

谢谢!

最佳答案

只需查看您的这部分代码:

#ifndef INTERFACE_H
#define INTERFACE_H
class Interface {
public:
virtual void blah() = 0;
};
#endif

您有一个具有纯虚方法的类。这意味着您无法创建一个直接接口(interface)类型的对象,如果使用它会编译失败。这意味着您必须从此类继承,并且从此类继承的所有类都必须实现函数 blah()。此外,由于您是从纯虚拟抽象基类继承的,因此您还应该拥有一个虚拟析构函数

你可以这样做:

#ifndef INTERFACE_H
#define INTERFACE_H

class Interface {
public:
virtual ~Interface();
virtual void blah() = 0;
};

#endif

#ifndef INTERFACE_IMPL
#define INTERFACE_IMPL

class InterfaceImpl : public Interface {
public:
InterfaceImpl() {}
virtual ~InterfaceImpl(){}

virtual void blah() override { /* implementation of blah here; */ }
};

#endif

然后,无论源代码使用 Interface 直接将其替换为 InterfaceImpl 还是指向 Inteface 类型的指针。如果您使用后者,则必须在 basechild 类之间进行一些转换。

关于python - 将对象转换为指向对象的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50472377/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com