当前位置:  开发笔记 > 编程语言 > 正文

在C++/CLI中,如何使用'out'参数声明和调用函数?

如何解决《在C++/CLI中,如何使用'out'参数声明和调用函数?》经验,为你挑选了2个好方法。

我有一个函数将一个字符串解析为两个字符串.在C#中我会声明它是这样的:

void ParseQuery(string toParse, out string search, out string sort)
{
    ...
}

我会这样称呼它:

string searchOutput, sortOutput;
ParseQuery(userInput, out searchOutput, out sortOutput);

当前项目必须在C++/CLI中完成.我试过了

using System::Runtime::InteropServices;

...

void ParseQuery(String ^ toParse, [Out] String^ search, [Out] String^ sort)
{
    ...
}

但如果我这样称呼它:

String ^ searchOutput, ^ sortOutput;
ParseQuery(userInput, [Out] searchOutput, [Out] sortOutput);

我得到一个编译器错误,如果我这样称呼它:

String ^ searchOutput, ^ sortOutput;
ParseQuery(userInput, searchOutput, sortOutput);

然后我在运行时收到错误.我该如何申报和调用我的功能?



1> Bert Huijben..:

C++/CLI本身不支持真正的"out"参数,但您可以将引用标记为out参数,以使其他语言将其视为真正的out参数.

您可以为以下参考类型执行此操作:

void ReturnString([Out] String^% value)
{
   value = "Returned via out parameter";
}

// Called as
String^ result;
ReturnString(result);

对于价值类型:

void ReturnInt([Out] int% value)
{
   value = 32;
}

// Called as
int result;
ReturnInt(result);

%使其成为'ref'参数,OutAttribute标记它仅用于输出值.


不要忘记在头文件中使用名称空间System :: Runtime :: InteropServices;,否则编译器找不到Out-Attribute。
您可以通过在变量定义上不使用^来轻松地重现使用.MC++自动调用IDisposable.变量超出范围时处理.(如果将变量传递给方法,则只需使用.而不是 - >和%变量)

2> 小智..:

使用Visual Studio 2008,这可以解决我工作中的一个主要问题.谢谢!

// header
// Use namespace for Out-attribute.
using namespace System::Runtime::InteropServices; 
namespace VHT_QMCLInterface {
   public ref class Client
   {
    public:
        Client();
        void ReturnInteger( int a, int b, [Out]int %c);
        void ReturnString( int a, int b, [Out]String^ %c);
   }
}

// cpp
namespace VHT_QMCLInterface {

    Client::Client()
    {

    }

    void Client::ReturnInteger( int a, int b, [Out]int %c)
    {
        c = a + b;
    }
    void Client::ReturnString( int a, int b, [Out]String^ %c)
    {
        c = String::Format( "{0}", a + b);
    }
}

// cs
namespace TestQMCLInterface
{
    class Program
    {
        VHT_QMCLInterface.Client m_Client = new VHT_QMCLInterface.Client();
        static void Main(string[] args)
        {
            Program l_Program = new Program();
            l_Program.DoReturnInt();
            l_Program.DoReturnString();
            Console.ReadKey();
        }

        void DoReturnInt()
        {
            int x = 10;
            int y = 20;
            int z = 0;
            m_Client.ReturnInteger( x, y, out z);
            Console.WriteLine("\nReturnInteger: {0} + {1} = {2}", x, y, z);
        }

        void DoReturnString()
        {
            int x = 10;
            int y = 20;
            String z = "xxxx";
            m_Client.ReturnString(x, y, out z);
            Console.WriteLine("\nReturnString: {0} + {1} = '{2}'", x, y, z);
        }
     }
}

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有