SWIG将C ++类转换为Python子类

问题描述

我遇到了以下问题:

我有一个C ++“ Factory”类,该类应该创建类“ BaseClass”的对象。 Factory应该可以被Python程序调用,因此我使用SWIG。我希望Factory可以创建Python对象,该对象的类在Python(BaseClass的“ DerivedClass”)中定义,因此 C ++未知。为此,工厂使用“ ICreator”实例进行实际创建,该实例由Python程序提供给Factory(请参见下面的代码)。

问题是创建了对象,但是我想将其“投射”到Python DerivedClass,而我不知道该怎么做。而且,不能调用BaseClass的“打印”方法

C ++代码(Factory.h):

            public:
                BaseClass() {}
                virtual ~BaseClass() {}
                virtual void print() { std::cout << "I am a BaseClass" << std::endl; }
            };

            class ICreator {
            public:
                virtual ~ICreator() {}
                virtual BaseClass* createObject() = 0;
            };

            class Factory {
            public:
                Factory() : mCreator(nullptr) {}
                virtual ~Factory() {}
                void setCreator(ICreator* creator) { mCreator = creator; }
                BaseClass* createObject() { return mCreator->createObject(); }
            private:
                ICreator* mCreator;
            };

SWIG文件

%{
#include <Factory.h>
%}
%feature("director") ICreator;
%include <Factory.h>

Python程序:

        class DerivedClass(BaseClass):
            def __init__(self):
                BaseClass.__init__(self)
            def print(self):
                print('I am a DerivedClass')
            def subclassMethod(self):
                print('DerivedClass.subclassMethod is called')

        class Creator(ICreator):
            def createObject(self):
                object = DerivedClass()
                object.print()
                return object
        
        factory = Factory()
        creator = Creator()
        factory.setCreator(creator)
        object = factory.createObject()
        print('object=',object)
        print('type(object)=',type(object))

        object.print() # 1) This call crashes
        derived_object = CastToDerived(object) # 2) How can I achieved this ???
        derived_object.subclassMethod()

当我运行程序时,仅在调用对象的构造函数之后,“ print”方法就可以了,但是当对象由“ factory.createObject”返回时,则不再可以调用

> I am a DerivedClass
> object= <BaseClass; proxy of <Swig Object of type 'BaseClass *' at 0x000002267ED914E0> >
> type(object)= <class 'BaseClass'>
> 
> Traceback (most recent call last):
>   File "testFactory.py",line XXX,in testFactory
>     object.print()
> AttributeError: 'BaseClass' object has no attribute 'print'

任何帮助将不胜感激。

柯南

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)