声明,更新和访问类中的System :: String

时间:2015-07-30 01:44:40

标签: .net string class visual-c++ c++-cli

我从昨天起就一直在寻找我的问题,但到目前为止我没有发现任何相关信息。顺便说一下,我对课程很陌生,所以请善待。

我在一个类中声明了一个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变量的初始化)但结果仍然相同。

1 个答案:

答案 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风格函数的不同抽象级别。你有两个混合在一起。我不会对此深入研究,因为这不是问题,这不是博客文章。