Как я приведу к интерфейсу в C ++ / CLI? - PullRequest
1 голос
/ 12 января 2012

У меня чертовски много времени для понимания синтаксиса C ++ / CLI.У меня есть переменная-член, определенная так:

gcroot<Object^> m_DotNetContextFactory;

Я хотел бы привести этот объект к интерфейсу IContextFactory.

Если бы я был в C #, я бы просто сделал следующее:

object contextFactory = ...;
IContextFactory contextFactory = (IContextFactory)contextFactory;

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Требуется двойное приведение, так как вы укоренили Object ^. Я предполагаю, что это проблема здесь. Например:

#include "stdafx.h"
#include <msclr\gcroot.h>
using namespace msclr;
using namespace System;

class native {
public:
    gcroot<Object^> m_foo;
};

interface class IBar {};
ref class managed : IBar {};


int main(array<System::String ^> ^args)
{
    native* nobj = new native;
    managed^ mobj = gcnew managed;
    nobj->m_foo = mobj;
    IBar^ itf = (IBar^)(Object^)nobj->m_foo;
    return 0;
}

Или сделать его более читаемым с помощью вспомогательной переменной:

    Object^ foo = nobj->m_foo;
    IBar^ itf = (IBar^)foo;
0 голосов
/ 12 января 2012

Если вы действительно имеете в виду C ++ / CLI, а не устаревший "Managed C ++", тогда я предлагаю использовать шаблон safe_cast, как подсказано следующим вопросом:

C ++ / CLI-Вопрос:есть эквивалент C # «есть» ключевое слово или я должен использовать отражение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...