我有一个包含(Poco)互斥锁的C ++类:
class ClassWithMutex
{
public:
ClassWithMutex();
virtual ~ClassWithMutex();
Poco::Mutex mMyMutex;
private:
ClassWithMutex(const ClassWithMutex& );
ClassWithMutex& operator=(const ClassWithMutex& other);
};
另一个类,使用它:
class ClassHavingAClassWithMutex
{
public:
ClassHavingAClassWithMutex();
~ClassHavingAClassWithMutex();
ClassWithMutex A;
private:
ClassHavingAClassWithMutex(const ClassHavingAClassWithMutex&);
ClassHavingAClassWithMutex& ClassHavingAClassWithMutex::operator=(const ClassHavingAClassWithMutex& other);
};
当尝试为ClassHavingAClassWithMutex创建包装时,出现错误:
Error C2248 'ClassWithMutex::operator =': cannot access private member declared in class 'ClassWithMutex' mvr C:\builds\vs2015\mvr\python_package\src\mvr\mvrPYTHON_wrap.cxx 6493
Swig生成的代码如下:
SWIGINTERN PyObject *_wrap_ClassWithMutex_mMyMutex_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
ClassWithMutex *arg1 = (ClassWithMutex *) 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
PyObject *swig_obj[1] ;
Poco::Mutex result;
if (!args) SWIG_fail;
swig_obj[0] = args;
res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ClassWithMutex, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ClassWithMutex_mMyMutex_get" "', argument " "1"" of type '" "ClassWithMutex *""'");
}
arg1 = reinterpret_cast< ClassWithMutex * >(argp1);
{
SWIG_PYTHON_THREAD_BEGIN_ALLOW;
result = ((arg1)->mMyMutex);
SWIG_PYTHON_THREAD_END_ALLOW;
}
resultobj = SWIG_NewPointerObj((new Poco::Mutex(static_cast< const Poco::Mutex& >(result))), SWIGTYPE_p_Poco__Mutex, SWIG_POINTER_OWN | 0 );
return resultobj;
fail:
return NULL;
}
以及此行发出的错误:
if (arg1) (arg1)->A = *arg2;
and
resultobj = SWIG_NewPointerObj((new Poco::Mutex(static_cast< const Poco::Mutex& >(result))), SWIGTYPE_p_Poco__Mutex, SWIG_POINTER_OWN | 0 );
Swig接口文件:
%immutable
%include "aiClassWithMutex.h"
%include "ClassHavingAClassWithMutex.h"
%mutable
关于如何使用Swig正确包装以上类的任何建议?为了防止任何复制,我在上面的类中将复制和分配ctor设为私有,但似乎仍然坚持?
答案 0 :(得分:0)
这不是由复制构造函数引起的,而是属性设置器(b / c A
是公共的)引起的。如评论中所述,一种选择是通过添加以下内容来隐藏它:
%ignore ClassWithMutex::mMyMutex;
.i文件中%include "aiClassWithMutex.h"
之前。
如前所述,SWIG在使mMyMutex
不变的情况下也采用复制方式。 AFAICT,除了编写类型映射并滥用optimal
设置(首先是防止构造临时文件)之外,没有其他方法。这样,可以正常运行的.i文件如下:
%module mut
%{
#include "aiClassWithMutex.h"
#include "ClassHavingAClassWithMutex.h"
%}
%feature("immutable", 1) ClassWithMutex::mMyMutex;
%typemap(out, optimal="1") Poco::Mutex %{
$result = SWIG_NewPointerObj(($1_ltype*)&$1, $&1_descriptor, 0);
%}
%include "aiClassWithMutex.h"
%include "ClassHavingAClassWithMutex.h"