在 VC++ 字典中添加 System::String^ 作为键

Adding a System::String^ as key in VC++ Dictionary

我是 C++ 的新手,所以我被困在一些我确信是微不足道的事情上。

我有字典:

Dictionary<String^, Room^>^ roomList = gcnew Dictionary<String^, Room^>();

我正在尝试向字典中添加一个新房间:

Room r("Room 1", x, y);
roomList->Add(r.getName, %r);

房间定义如下:

ref class Room
{

private:
String^ mName;
double mX; //scaled X-coordinate of top left corner (meters)
double mY; //scaled Y-coordinate of top left corner (meters)

public:
Room(String^ name, double x, double y); 

String ^ const getName() { return mName; }
double const getX() { return mX; }
double const getY() { return mY; }

};

当我尝试编译代码时出现以下错误:

'Room::getName': non-standard syntax; use '&' to create a pointer to member"

我做错了什么?出于某种原因,我不能使用对象的名称 (a System::String^) 作为键,但我不确定为什么。

   roomList->Add(r.getName, %r);

您将 getName 声明为函数,而不是 属性。所以它需要是 r.GetName(),注意添加的 () 括号。声明名称 属性 是明智的,这是 .NET 方式。

   Room r("Room 1", x, y);

这个声明在技术上是错误的。您正在使用堆栈语义, r 对象将在代码执行离开范围块时自动处理。您永远不想将已处置的对象添加到集合中。在这种情况下,你会侥幸逃脱,因为你实际上并没有实现析构函数。如果你这样做,你会很不幸。不幸的是你的代码 reader 。只要做对了:

   Room^ r = gcnew Room("Room 1", x, y);
   roomList->Add(r=>getName(), r);

最后但同样重要的是,这看起来像是一项学生作业。您无法通过此代码获得及格分数,它不是 C++。您使用的语言称为 C++/CLI,它是一种扩展语言,有助于为 .NET 程序编写互操作代码。