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);
)。