2016-10-18 4 views
1

Я действительно не верю, что этот вопрос никогда не задавался раньше, но я действительно старался искать без успеха, если у вас есть ссылка на уже подобранный ответ, пожалуйста, поделитесь им.Портирование с C++ на C++/CLI

Я портирую программу C++/Win32 на C++/CLI, и, конечно же, я пытаюсь сделать меньшее количество модификаций возможным для кода, чтобы ускорить этап повторного тестирования.

У меня возникли некоторые проблемы из-за глобальные функции, имеющие объекты в качестве параметров, здесь короткий пример:

заголовочного файл класса

namespace MyNamespace { 
    public ref class MyClass { 
    public: 
     void test(); 
    }; 
} 

Class файл касты

using MyNamespace; 

void myFunction(MyClass ^obj); 

void MyClass::test() { 
    myFunction(this); 
} 

И вот возникает проблема: если я не буду оставлять myFunction из MyNamspace, он не может использовать MyClass в качестве типа параметра. Если я включу myFunction в MyNamespace, каждый файл cpp будет скомпилирован правильно, но я получу ошибку компоновщика «LNK2028 неразрешенный токен».

Идея состоит в том, чтобы определить новый класс и включить myFunction в качестве общедоступного статического метода, но для этого будет долгая работа, потому что myFunction в реальном проекте не одинок ... Любая другая идея?

+0

Вы определяете (реализуете) 'myFunction' где-нибудь? Если это «токен» (символ, на мой взгляд, действительно есть сообщение об ошибке), который не разрешен (пожалуйста, укажите сообщение об ошибке * complete * без редактирования). –

+1

тег «интерфейс командной строки» глупо CLI в «C++/CLI» означает «Common Language Infrastructure» – PeterT

+2

Ну, вы просто написали это объявление прототипа, чтобы подавить сообщение об ошибке компилятора, в котором говорилось, что вы делаете это неправильно. Не помешало вам сделать это неправильно, теперь линкер обнаруживает, что на самом деле у вас нет этой функции.Очень важно, чтобы C++/CLI выполнял ** не ** напрямую переводить собственный C++ на управляемый код, но только записывал классы-оболочки для * открытого * интерфейса в вашу библиотеку. Оставьте всю внутреннюю сантехнику как есть. И настройте эти обертки, чтобы они были удобны в использовании с системой управляемого типа. http://stackoverflow.com/a/2691448/17034. –

ответ

0

Если MyClass в MyNamespace и myFunction нет, вы можете использовать MyClass с полной квалификацией имени:

void myFunction(MyNamespace::MyClass ^obj); 

Конечно ваш myFunction должен быть реализован где-то.

+0

Конечно, это реализовано, я сделал неправильное предположение, что это было очевидно. Спасибо, я попробую это и дам вам знать. – Beddu

+0

Итак, я должен сказать, что это проще, чем я ожидал! Достаточно сохранить глобальные функции (myFunction) из пространства имен (MyNamespace) и включить прототипы в файл cpp, где реализованы методы класса (MyClass :: test). Затем в файле cpp, где реализованы глобальные функции, я должен сказать компилятору, что буду использовать классы из пространства имен (используя пространство имен MyNamespace;), поэтому мне не нужно указывать его в каждом объявлении. Я напишу ответ с правильным кодом. – Beddu

0

Я сделал несколько тестов следующих предложениями Никиту, а последний, работая, код выглядит следующим образом:

заголовочного файл класс

namespace MyNamespace { 
    public ref class MyClass { 
    public: 
     void test(); 
    }; 
} 

Class файл касты

void myFunction(MyClass ^obj); 

using MyNamespace; 

void MyClass::test() { 
    myFunction(this); 
} 

Глобальный файл cpp функции

using namespace MyNamespace; 

void myFunction(MyClass ^obj) { 
    //do something 
} 

Используя этот подход в файле CPP глобальной функции является возможность использовать MyClass в то время как туРипсЫоп остается (или делать вид, чтобы остаться) глобальными, и MyClass :: тест может получить доступ к MYFUNCTION даже если не в том же пространстве имен, используя только объявление прототипа, как в «старом» C++.