在C ++ / CLI中更改通用列表中的成员值

时间:2012-05-28 18:12:55

标签: c++-cli

下面是一个简单的C ++ / CLI示例。

// TestCLR.cpp : main project file.

#include "stdafx.h"

using namespace System;

int main(array<System::String ^> ^args)
{
    System::Collections::Generic::List<String^> TestList;

    for(int i = 0; i < 10 ; i++)
    {
        TestList.Add(i.ToString());
    }

    for each(String^% st in TestList)
    {
        st += "TEST";
        Console::WriteLine(st);
    }

    for each(String^ st in TestList)
    {
        Console::WriteLine(st);
    }

    return 0;
}

我得到以下输出:

0TEST
1TEST
2TEST
3TEST
4TEST
5TEST
6TEST
7TEST
8TEST
9TEST
0
1
2
3
4
5
6
7
8
9

简而言之,即使我使用跟踪指针将其值更改为“TEST”, TestList 中的值也不会更改。

我应该在上面的代码段中修改哪些内容,以便永久更改该值?

2 个答案:

答案 0 :(得分:1)

你有一个System::Collections::Generic::List,它使用一个属性来访问项目。您无法将跟踪引用绑定到属性,而是最终引用该值的临时副本。

该代码适用于数组,但foreach不能用于在容器中就地修改元素。你需要一个for循环,因为你需要索引来覆盖列表元素:

for(int i = 0, cnt = TestList.Count; i < cnt; ++i)
{
    TestList[i] += "TEST";
    Console::WriteLine(TestList[i]);

    // doesn't work right: String^% st = TestList[i];
    // since TestList[i] is not an lvalue, it's a function call to a getter method
}

您是否收到编译器警告,告诉您绑定了对临时对象的非const引用?

答案 1 :(得分:1)

您在这里没有得到编译器的帮助。它是C#中的CS1656 error,但C ++ / CLI编译器忘记为您提供诊断。

foreach迭代变量是IEnumerable<T>::Current属性的别名。只有一个吸气剂,它没有一个二传手。所以它永远不会更新底层集合。你需要在这里使用plain for()循环。