في C ++ / CLI، كيف أصرح واستدعاء دالة مع معلمة "خارج"؟

StackOverflow https://stackoverflow.com/questions/186477

  •  06-07-2019
  •  | 
  •  

سؤال

ولدي وظيفة التي يوزع سلسلة واحدة إلى سلسلتين. في 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);

وثم أحصل على خطأ في وقت التشغيل. كيف ينبغي أن يعلن والدعوة وظيفة لي؟

هل كانت مفيدة؟

المحلول

وC ++ / CLI نفسها لا يعتمد الحقيقية "من حجة، ولكن يمكنك وضع علامة على إشارة كحجة خارج لجعل لغات أخرى ترى أنها حجة حقيقية للخروج.

ويمكنك القيام بذلك عن أنواع المراجع على النحو التالي:

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);

وو٪ يجعل من "المرجع" المعلمة ويصادف OutAttribute أن يتم استخدامه فقط للقيم الانتاج.

نصائح أخرى

وباستخدام 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);
        }
     }
}

وليست مدعومة من. الأقرب يمكنك الحصول هو المرجع

ومنحت يمكنك أنها وهمية، ولكن تفقد الاختيار وقت الترجمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top