问题描述
我遇到了以下问题:
我有一个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 (将#修改为@)