我正在尝试在运行中创建System::DateTime
的实例,并在用户使用'P'参数时将其分配给System::DateTime gDate
。但是,我在代码片段后面显示错误。
case 'P':
gDate=new DateTime(std::stoi(year), std::stoi(month), std::stoi(day));
cout << "Persian Date is: " << pDate.GetDayOfMonth(gDate) << "/" <<
pDate.GetMonth (gDate) << "/" << pDate.GetYear(gDate) << endl;
break;
错误C3255'System :: DateTime':无法动态分配此值 在本机堆上键入对象
导致错误的原因是什么?我应该如何预防?
更新:
我可能应该首先说,我也尝试了以下定义:
DateTime gDate(std::stoi(year), std::stoi(month), std::stoi(day));
但是,我收到错误Error C2360 initialization of 'gDate' is skipped by 'case' label
答案 0 :(得分:2)
如果你不需要gDate作为指针,而你几乎肯定不会,请尝试:
case 'P':
{
DateTime gDate(std::stoi(year), std::stoi(month), std::stoi(day));
cout << "Persian Date is: " << pDate.GetDayOfMonth(gDate) << "/" <<
pDate.GetMonth (gDate) << "/" << pDate.GetYear(gDate) << endl;
}
break;
大括号为gDate建立了一个范围,确保在程序退出大括号时删除。
CLI / CLR C ++与C ++不同,它有一些不同的语义。
CLI / C ++添加了value
和ref
结构和类的概念。这些是具有自动寿命控制的对象。 .Net运行时,而不是程序员,决定它们何时生存和死亡,这需要不同的语法。
那些标记为value
的用户可以使用普通的旧数据类型,如int或double。创建&amp; em作为临时用户,使用它们,让堆栈或其他任何管理临时变量的方法都在使用,以便进行清理。您可以指向它们,但不建议这样做。
ref
结构和类在设计时考虑了引用用途,并且是指针的开放式游戏,只要它们是垃圾收集指针。
System :: DateTime是一个值结构,因此它推荐使用的是strays。作为指针,System :: DateTime必须用作垃圾收集指针,^
代替*
,并用gcnew
代替new
或作为具有已定义范围的变量。
如果gDate必须是指针,则必须定义
DateTime ^ gDate;
分配它需要
gDate = gcnew DateTime(std::stoi(year), std::stoi(month), std::stoi(day));
当没有对此分配对象的进一步引用时,gDate和gDate的任何副本都超出了范围,.Net运行时的垃圾收集器将销毁它。
答案 1 :(得分:1)
正如here所解释的那样,您可以在堆栈上创建DateTime
,但不能在堆上创建。{/ p>
试试这样:
DateTime gDate(std::stoi(year), std::stoi(month), std::stoi(day));
cout << "Persian Date is: " << pDate.GetDayOfMonth(gDate) << "/" <<
pDate.GetMonth (gDate) << "/" << pDate.GetYear(gDate) << endl;
break;
或者,您可以使用gcnew
分配托管内存:
DateTime^ gDate = gcnew DateTime(std::stoi(year), std::stoi(month), std::stoi(day));