Оператор амперсанда в смешанном управляемом / неуправляемом проекте C++/CLI
При написании функции в классе ссылок C++/CLI я хочу передать указатель на указатель на объект при вызове встроенной функции.
Родная функция
void MyNativeFunc(NativeObject** obj);
Управляемая функция C++/CLI
ref class ManagedType
{
static NativeObject* m_NativeObj;
void MyManagedFunc()
{
MyNativeFunc(&m_NativeObj); // Error here
}
}
Проблема здесь в том, что &m_NativeObj
в C++/CLI не является NativeObject**
, Это interior_ptr<NativeObject*>
которую нативная функция не может принять. Существует ли такой синтаксис, чтобы я мог выполнять эту простую справочную операцию без использования управляемого указателя?
Изменить: извинения. Первоначально m_NativeObj
был членом функции в вопросе, а не статическим членом класса. У меня проблема, только если это статический член.
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;
};