混合 Managed/Unmanaged C++/CLI 项目中的 & 运算符
Ampersand Operator in Mixed Managed/Unmanaged C++/CLI Project
在 C++/CLI ref 中编写函数 class,我希望在调用本机函数时传递指向对象的指针。
原生函数
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
是问题中的函数成员,而不是 class 的静态成员。只有当它是静态成员时我才会遇到问题。
我假设您的本机函数采用 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;
};
另一方面,如果本机函数是 in/out 函数, 可以 为指针分配一个新值,您可以编写如下代码:
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;
};
在 C++/CLI ref 中编写函数 class,我希望在调用本机函数时传递指向对象的指针。
原生函数
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
是问题中的函数成员,而不是 class 的静态成员。只有当它是静态成员时我才会遇到问题。
我假设您的本机函数采用 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;
};
另一方面,如果本机函数是 in/out 函数, 可以 为指针分配一个新值,您可以编写如下代码:
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;
};