Управляемый C ++: строки в списке не передаются вызывающей стороне - PullRequest
2 голосов
/ 02 декабря 2009

У меня есть консольное приложение C # .Net, которое вызывает библиотеку классов C ++ .Net. Однако, когда выполняется следующее приложение, список становится пустым !!!

Если я удалю строку, как указано в комментарии рядом с ней, код работает. Я не понимаю причину этого.

Если я хочу перераспределить память для списка в библиотеке классов C ++, как то, что я пытаюсь сделать ниже, каков правильный способ сделать это?

C # 2005 Консольное приложение

class Caller
{
    static void Main(string[] args)
    {
        Callee callee = new Callee();
        List<String> s = new List<String>();
        callee.DoSomething(s);

        Console.WriteLine(s.Count); // Prints out 0
    }
}

Библиотека классов C ++ 2005

public ref class Callee
{
    public:
    void DoSomething(List<String^>^ list);
};

void Callee::DoSomething(List<String^>^ list)
{
    list = gcnew List<String^>(); // Remove this line and it works
    list->Add(gcnew String("Test String 1"));
    list->Add(gcnew String("Test String 2"));
}

1 Ответ

1 голос
/ 02 декабря 2009

Вы хотите эквивалент этого в C ++ / CLI (код C # следует)

class Caller
{
    static void Main(string[] args)
    {
        Callee callee = new Callee();
        List<String> s = new List<String>();
        callee.DoSomething(ref s);

        Console.WriteLine(s.Count); // Prints out 0
    }
}

public class Callee 
{
    void DoSomething(ref List<string> list)
    {
        list = new List<string>(); 
        list.Add("Test String 1");
        list.Add("Test String 2");
    }
}

Обратите внимание, что «список» передается по ссылке, поэтому при выделении нового объекта он изменит исходную переменную, переданную в функцию.

Эквивалентный синтаксис C ++ / CLI выглядит следующим образом:

public ref class Callee
{
    public:
    void DoSomething(List<String^>^% list);
};

void Callee::DoSomething(List<String^>^% list)
{
    list = gcnew List<String^>(); 
    list->Add(gcnew String("Test String 1"));
    list->Add(gcnew String("Test String 2"));
}

Добавление "%" к типу, приведенному в этом списке, приведет к тому, что список будет передан в качестве ссылки для отслеживания.

Более подробную информацию об отслеживании ссылок можно найти по адресу http://en.wikipedia.org/wiki/C%2B%2B/CLI#Tracking_references

...