在C ++ / CLI ref类中编写函数时,我希望在调用本机函数时传递一个指向对象的指针。
原生功能
void MyNativeFunc(NativeObject** obj);
托管C ++ / CLI功能
ref class ManagedType
{
static NativeObject* m_NativeObj;
void MyManagedFunc()
{
MyNativeFunc(&m_NativeObj); // Error here
}
}
这里的问题是C ++ / CLI中的&m_NativeObj
不是NativeObject**
。它是本地函数无法接受的interior_ptr<NativeObject*>
。是否有一种语法,以便我可以执行这个简单的引用操作而不会产生托管指针?
修改
道歉。最初,m_NativeObj
是问题中的函数成员,而不是类的静态成员。我只有在它是静态成员时才会遇到问题。
答案 0 :(得分:1)
我假设你的原生函数采用NativeObject**
的原因是因为函数会为它分配一个新对象,在这种情况下你可以这样做:
class NativeObject { };
void MyNativeFunc(NativeObject** obj) {
*obj = new NativeObject;
}
ref class ManagedObject
{
public:
void Test()
{
NativeObject* p = nullptr;
MyNativeFunc(&p);
delete m_NativeObj;
m_NativeObj = p;
}
static NativeObject* m_NativeObj = nullptr;
};
另一方面,如果本机函数是可能为指针指定新值的输入/输出函数,则可以编写如下代码:
class NativeObject { };
void MyNativeFunc(NativeObject** obj) {
if (!(*obj))
*obj = new NativeObject;
}
ref class ManagedObject
{
public:
void Test()
{
pin_ptr<NativeObject> pinned = m_NativeObj;
NativeObject* p = pinned;
MyNativeFunc(&p);
if (p != m_NativeObj)
{
delete m_NativeObj;
m_NativeObj = p;
}
}
static NativeObject* m_NativeObj = nullptr;
};