在 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 会确保该字段。
我有 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 会确保该字段。