Cython c++模块,多次调用构造函数
Cython c++ module, constructor called multiple times
我正在尝试使用Cython将我的c ++类包装到python中。我能够创建 so 文件并在 python 中导入,但我的 c++ 类的构造函数被多次调用。
这就是我到目前为止所做的。
文件: DBReader.h
#ifndef _DB_READER_H_
#define _DB_READER_H_
#include <iostream>
class DBReader
{
public:
DBReader();
~DBReader();
};
#endif /* _DB_READER_H_ */
文件: DBReader.cxx
#include "DBReader.h"
DBReader::DBReader()
{
std::cout << "Hellon";
}
DBReader::~DBReader()
{
}
文件: dbreader.pyx
# distutils: language = c++
# distutils: sources = DBReader.cxx
cdef extern from "DBReader.h":
cdef cppclass DBReader:
DBReader() except +
cdef class PyDBReader:
cdef DBReader c_dbreader # hold a C++ instance which we're wrapping
def __cinit__(self):
self.c_dbreader = DBReader()
文件: setup.py
from distutils.core import setup, Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext
modules = [Extension("dbreader",
sources=["dbreader.pyx", "../DBReader.cxx"],
include_dirs = [".."],
libraries = ["xxxx"],
library_dirs = ["/usr/local/lib64"],
language = "c++")]
setup(ext_modules = modules, cmdclass = {"build_ext" : build_ext})
运行setup.py build_ext --inplace
dbreader.so 文件后。而且我能够在python中导入。但正如你在下面看到的:你好被打印了三次。
>>> import dbreader
>>> h = dbreader.PyDBReader()
Hello
Hello
Hello
>>>
这一行的问题:
self.c_nodegraph_dbreader = RtlNodeGraphDBReader()
如果你只想要一个默认构造的实例,你已经有了,没有这一行。
通过添加此行,您将显式构造第二个此类实例,然后将其复制到原始实例上,然后...我不确定这一切是如何工作的,但我的猜测是自动生成的复制构造函数正在第三次调用默认构造函数。
相关文章:
- 在c++中使用向量时,如何调用构造函数和析构函数
- C++:考虑但不调用构造函数的特殊性
- 对象实例化调用构造函数的次数太多
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C ++:通过大括号调用构造函数?
- 不能调用构造函数
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- 在模板化类的构造函数中调用构造函数
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 我不明白在这个例子中什么时候调用构造函数
- 调用c++构造函数的不同方法
- 调用构造函数与将内联常量定义为默认参数
- 如何通过 Rust FFI 调用C++构造函数?
- "new"运算符是否总是调用构造函数?
- 无法调用构造函数
- 使用 "()" 调用构造函数不同于"{}"
- 确定是调用构造函数还是强制转换运算符的因素