Оператор амперсанда в смешанном управляемом / неуправляемом проекте 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;
};
Другие вопросы по тегам