CythonクラスをいくつかのC++コードに埋め込む必要があり、継承を機能させることができず、基本クラスのフィールドにアクセスしようとするとセグメンテーションフォルトが発生し続けることがあります。プロジェクトの制約のため、C++クラスをラップしたり、クラスをCythonコードから削除することはできません。Cythonクラス継承とC++への埋め込み
< < <ファイル:fooClass.pyx >>>
from math import sin
cdef public class FooSuper[object FooSuper, type FooSuperType]:
def __init__ (self, a):
print "FooSuper.__init__ START"
self.a = a
print "FooSuper.__init__ END"
cdef public class Foo(FooSuper)[object Foo, type FooType]:
def __init (self, a, b):
print "Foo.__init__ START"
FooSuper.__init__(self, a)
self.b = b
print "Foo.__init__ END"
cdef double bar (self, double c):
return sin(self.a * c)
cdef public Foo buildFoo (double a, double b):
print "buildFoo(a,b) START"
return Foo(a,b)
cdef public double foobar (Foo foo, double c):
print "foobar(Foo,c) START"
return foo.bar(d)
< < <ファイル:foo.cc >>>
#include <Python.h>
#include "fooClass.h"
#include <iostream>
int main(){
Py_Initialize();
initfooClass();
Foo *foo = buildFoo(1.0, 2.0);
std::cout << foobar(foo, 3.0) << std::endl;
Py_Finalize()
}
ここに私の問題の蒸留例があります私はこれを実行し、私は以下を受け取る:
< < < STDアウト>>>
buildFoo(a,b)
Foo.__init__ START
foobar(Foo,d)
Segmentation fault
は、私はC++でCythonを埋め込むには、このアプローチは、単にはFooクラスで動作することを知って、私はFooSuper.__init__
が呼び出されることはありません、FooSuper
からFoo
を拡張しようとします。私はこの問題が私の初期化方法から来なければならないことを知っていますが、私は__init__
を__cinit__
に変更せずに両方とも変換しました。明らかに、segfaultはFooSuper
のフィールドからまったく初期化されていません。また、FooSuper
クラスに中空の__cinit__(self, *args)
を追加してみましたが、変更はありません。誰かが私を助けることができれば、私は非常に感謝します。ありがとう。