我从昨天起就一直在寻找我的问题,但到目前为止我没有发现任何相关信息。顺便说一下,我对课程很陌生,所以请善待。
我在一个类中声明了一个System::String
变量,我创建了一个更新该变量的方法,另一个返回了它的值。但是,更新所述变量会引发异常。在类中声明System::String
的正确方法是什么?如何从类中更新并返回它的值?
例外:
A first chance exception of type 'System.NullReferenceException' occurred in XXX.exe
以下是我所制作课程的简化版本:
ref class clTimeStamp {
public:
clTimeStamp()
{
strDatestamp = gcnew System::String("");
}
private:
System::String ^strDatestamp;
public:
void SetDateStamp(System::String ^a)
{
strDatestamp = a->Substring( 6, 4 ); // yyyy
strDatestamp = strDatestamp + "-" + a->Substring( 3, 2 );
strDatestamp = strDatestamp + "-" + a->Substring( 0, 2 ) + "T";
}
System::String ^GetDateTimeStamp()
{
return strDatestamp;
}
};
这就是我在主程序中使用它的方式:
strBuffer = gcnew String(buffer.c_str());
clTimeStampHSCAN1->SetDateStamp(strBuffer);
fprintf(handle, "%s\n", clTimeStampHSCAN1->GetDateTimeStamp());
我对C ++中的字符串感到困惑 - CLI,创建它们的方法太多了,而且它变得非常复杂。
非常感谢您的帮助。
编辑:更新了Caninonos的建议(更改构造函数中String变量的初始化)但结果仍然相同。
答案 0 :(得分:1)
我认为问题不在您发布的代码中,而是省略了代码。在调用SetDateStamp()
成员函数之前,必须使用gcnew分配的clTimeStamp对象初始化clTimeStampHSCAN1指针。这是一个适合我的例子。
// so_string.cpp : main project file.
#include "stdafx.h"
#include <string>
using namespace System;
ref class clTimeStamp {
public:
clTimeStamp()
{
strDatestamp = nullptr;
}
private:
System::String ^strDatestamp;
public:
void SetDateStamp(System::String ^a)
{
strDatestamp = a->Substring( 6, 4 ); // yyyy
strDatestamp = strDatestamp + "-" + a->Substring( 3, 2 );
strDatestamp = strDatestamp + "-" + a->Substring( 0, 2 ) + "T";
}
System::String ^GetDateTimeStamp()
{
return strDatestamp;
}
};
int main(array<System::String ^> ^args)
{
// This is unmanaged C++
std::string buffer("01/15/2016 23:00");
FILE *handle = fopen ("c:\\temp\\myfile.txt" , "w");
// These are .NET managed objects
String ^strBuffer = gcnew String(buffer.c_str());
clTimeStamp ^clTimeStampHSCAN1 = gcnew clTimeStamp();
clTimeStampHSCAN1->SetDateStamp(strBuffer);
fprintf(handle, "%s\n", clTimeStampHSCAN1->GetDateTimeStamp());
return 0;
}
注意:我真的想清理这段代码,但我决定保留它与原始示例大致相同。值得关注的一些事情是输入的一致命名和验证。 C ++ - CLI允许从高级.Net管理到靠近硬件的低级C风格函数的不同抽象级别。你有两个混合在一起。我不会对此深入研究,因为这不是问题,这不是博客文章。