提升 Python 从纯虚拟继承 Class
Boost Python Inheriting from Pure Virtual Class
在 Boost Python 模块中使用来自纯虚拟 class 的派生 class 时,我收到以下错误:
allocating an object of abstract class type
没有 Boost Python 模块,错误就不会出现。在以下示例中(接近我的用例),问题是什么?我必须让 Python 知道 Base
和 Derived
之间的继承关系吗?
PythonMinimal.cpp
#include <boost/python.hpp>
#include <vector>
using namespace boost::python;
//Base class - pure virtual.
template<typename T>
class Base{
public:
virtual void foo() = 0;
};
//Derived class, inherites from Base.
template<typename T>
class Derived : public Base<T>{
public:
Derived(int a, int b){
//Do something.
}
void foo(){
//Do something else.
}
};
//Test class, uses instances of Derived stored in STL container of Base.
template<typename T>
class TestClass{
public:
std::vector< Base<T> > vec;
TestClass(int a, int b){
vec.push_back(Derived<T>(a, b));
}
void foo(){
vec.at(0).foo();
}
};
//Build python module.
BOOST_PYTHON_MODULE(cpuMLP){
class_< TestClass<float> >("TestClass", init<int, int>())
.def("foo", &TestClass<float>::foo);
};
CMakeLists.txt
#Set CMake Version and project name.
cmake_minimum_required(VERSION 2.8)
project(PythonMinimal)
#Attempt to find Python and Boost Python.
find_package(PythonInterp)
find_package(PythonLibs)
find_package(Boost COMPONENTS python)
#Find includes.
include_directories(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})
#Add library to project.
add_library(PythonMinimal SHARED PythonMinimal.cpp)
target_link_libraries(PythonMinimal ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})
这与 python 完全无关(您没有将 Base
或 Derived
暴露给 python),问题出在您的 vector
:
std::vector< Base<T> > vec;
Base<T>
是一个摘要 class,您持有 个值。那是行不通的。您需要通过指针存储它们:
std::vector<std::unique_ptr<Base<T>>> vec;
这样您就不会切片 Derived<T>
对象。
在 Boost Python 模块中使用来自纯虚拟 class 的派生 class 时,我收到以下错误:
allocating an object of abstract class type
没有 Boost Python 模块,错误就不会出现。在以下示例中(接近我的用例),问题是什么?我必须让 Python 知道 Base
和 Derived
之间的继承关系吗?
PythonMinimal.cpp
#include <boost/python.hpp>
#include <vector>
using namespace boost::python;
//Base class - pure virtual.
template<typename T>
class Base{
public:
virtual void foo() = 0;
};
//Derived class, inherites from Base.
template<typename T>
class Derived : public Base<T>{
public:
Derived(int a, int b){
//Do something.
}
void foo(){
//Do something else.
}
};
//Test class, uses instances of Derived stored in STL container of Base.
template<typename T>
class TestClass{
public:
std::vector< Base<T> > vec;
TestClass(int a, int b){
vec.push_back(Derived<T>(a, b));
}
void foo(){
vec.at(0).foo();
}
};
//Build python module.
BOOST_PYTHON_MODULE(cpuMLP){
class_< TestClass<float> >("TestClass", init<int, int>())
.def("foo", &TestClass<float>::foo);
};
CMakeLists.txt
#Set CMake Version and project name.
cmake_minimum_required(VERSION 2.8)
project(PythonMinimal)
#Attempt to find Python and Boost Python.
find_package(PythonInterp)
find_package(PythonLibs)
find_package(Boost COMPONENTS python)
#Find includes.
include_directories(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})
#Add library to project.
add_library(PythonMinimal SHARED PythonMinimal.cpp)
target_link_libraries(PythonMinimal ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})
这与 python 完全无关(您没有将 Base
或 Derived
暴露给 python),问题出在您的 vector
:
std::vector< Base<T> > vec;
Base<T>
是一个摘要 class,您持有 个值。那是行不通的。您需要通过指针存储它们:
std::vector<std::unique_ptr<Base<T>>> vec;
这样您就不会切片 Derived<T>
对象。