Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 在VC+中添加System::String^作为键+;字典 我对C++完全陌生,所以我被困在一些我认为很琐碎的东西上。_Dictionary_C++ Cli - Fatal编程技术网

Dictionary 在VC+中添加System::String^作为键+;字典 我对C++完全陌生,所以我被困在一些我认为很琐碎的东西上。

Dictionary 在VC+中添加System::String^作为键+;字典 我对C++完全陌生,所以我被困在一些我认为很琐碎的东西上。,dictionary,c++-cli,Dictionary,C++ Cli,我有一本字典: 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

我有一本字典:

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':非标准语法;使用“&”创建指向成员的指针

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

   roomList->Add(r.getName, %r);
您将getName声明为函数,而不是属性。因此它必须是
r.getName()
,请注意添加的()括号。声明Name属性是明智的,这是.NET方式

   Room r("Room 1", x, y);
此声明在技术上是错误的。您使用的是堆栈语义,当代码执行离开作用域块时,
r
对象将自动被释放。您永远不想将已释放的对象添加到集合中。在这种情况下,您将逃脱惩罚,因为您没有实际实现析构函数。如果您真的实现了析构函数,那就糟了。让你的代码的读者感到悲哀。只要正确地执行它:

   Room^ r = gcnew Room("Room 1", x, y);
   roomList->Add(r=>getName(), r);
<>最后但并非最不重要的一点,这看起来像是一个学生作业。你不能得到这个代码的通过等级,它不是C++。你使用的语言叫做C++ + CLI,它是一种扩展语言,帮助编写.NET程序的互操作代码。 您将getName声明为函数,而不是属性。因此它必须是
r.getName()
,请注意添加的()括号。声明Name属性是明智的,这是.NET方式

   Room r("Room 1", x, y);
此声明在技术上是错误的。您使用的是堆栈语义,当代码执行离开作用域块时,
r
对象将自动被释放。您永远不想将已释放的对象添加到集合中。在这种情况下,您将逃脱惩罚,因为您没有实际实现析构函数。如果您真的实现了析构函数,那就糟了。让你的代码的读者感到悲哀。只要正确地执行它:

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

<>最后但并非最不重要的一点,这看起来像是一个学生作业。你不能得到这个代码的通过等级,它不是C++。你使用的语言叫做C++ + CLI,它是帮助编写.NET程序互操作代码的扩展语言。

谢谢你的彻底响应。它帮助我清除了一些有点模糊的东西。我向你保证,这不是学生作业,而是我尝试从VB.NET分支到C++的事实,所以它是C++ + CLI的事实不会引起一些教授的愤怒。但是,我所看过的大部分教程都是严格的C++,所以我不知道你可以声明一个属性。“实例化一个对象对我来说是新的。我必须进一步研究这个问题。C++/CLI的设计者将“引用类型上的堆栈语义”隐式化是一个错误。特别是对于那些甚至没有析构函数/<代码> IDISPOLISTION 实现的对象。它不是,C++中的神圣的RAII模式。但是托管类型不是为RAII设计的,尤其是当它们甚至没有所需的特征时。我不是说他们根本不应该把它放进去,我是说他们应该把它说清楚(例如,
autodisposer(“1号房间”,x,y);
)。谢谢你的全面回复。这有助于澄清一些在我脑海中有点模糊的事情。我向你保证,这不是学生作业,而是我尝试从VB.NET分支到C++,所以它是C++ + CLI的事实不会招致一些教授的愤怒。但是,我看过的大部分教程都是严格的C++,所以我不知道你可以声明一个属性。此外,实例化对象的“堆栈语义”概念对我来说是新概念。我必须进一步研究这个问题。C++/CLI的设计者将“引用类型上的堆栈语义”隐式化是一个错误。特别是对于那些甚至没有析构函数/<代码> IDISPOLISTION 实现的对象。它不是,C++中的神圣的RAII模式。但是托管类型不是为RAII设计的,尤其是当它们甚至没有所需的特征时。我不是说他们根本不应该把它放进去,我是说他们应该把它弄清楚(例如,
autodisposer(“房间1”,x,y);
)。