在 C++ CLI 中创建 public 字符串

Create a public string in C++ CLI

我有 2 个 class。 我在 C++/CLI 中使用 System::Speech::recognition。 现在,我在最后有事件处理程序:

recognizer->SpeechRecognized += gcnew EventHandler<SpeechRecognizedEventArgs^>(sre_SpeechRecognized);

我还有回调函数:

void sre_SpeechRecognized(Object^ sender, SpeechRecognizedEventArgs^ e)
{
    // Do something
}

这给我一个错误:

Invalid Delegate initializer -- Function is no Member of a managed-class

知道为什么,知道如何解决吗?

还有另一个(相关)问题:

sre_SpeechRecognized() 应将结果值分配给字符串变量。

现在:该字符串变量在同一个 class 中声明: public: String^ res_SR = "" C++ CLI 也因此讨厌我。 (不知何故我没有 std::string,只有 System::String...)

知道如何解决这 2 个问题吗?

编辑(以防我的错误代码片段有所帮助):

ref class tsapi
{
    void recogn_speech() {
        SpeechRecognizer^ recognizer = gcnew SpeechRecognizer();

        Choices^ commands_vc = gcnew Choices();
        commands_vc->Add(gcnew array<String^> { "Move", "To" });

        GrammarBuilder^gb = gcnew GrammarBuilder();
        gb->Append(commands_vc);

        Grammar^ g = gcnew Grammar(gb);
        recognizer->LoadGrammar(g);

        // Register Event
        recognizer->SpeechRecognized += gcnew EventHandler<SpeechRecognizedEventArgs^>(sre_SpeechRecognized);
    }

    void sre_SpeechRecognized(Object^ sender, SpeechRecognizedEventArgs^ e)
    {
        String^ res = e->Result->Text->ToString();
    }
};

.Net没有'global functions'的概念。 一切 都必须包含在class 中。 C++/CLI 编译器将采用一些看起来像全局变量的方法和变量,并将它们作为静态成员粘贴在特殊的 class 中,但显然不是全部。把代码放在你正在做的地方 recognizer->SpeechRecognized += ...,把它放在 class 中(ref class,所以它是一个托管的 class),然后把 sre_SpeechRecognized 放在里面class 还有。

对于字符串赋值错误,您需要将赋值从 class 定义移到构造函数中。与 C++ 一样,C++/CLI 不允许在 class 定义中分配实例变量。但是,我会考虑放弃显式分配:由于您分配的是空字符串,请考虑将该字段保留为 nullptr,默认情况下 .Net 会确保该字段。