In C ++ / CLI, wie kann ich erklären und eine Funktion mit einem ‚out‘ Parameter nennen?

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

  •  06-07-2019
  •  | 
  •  

Frage

Ich habe eine Funktion, die eine Zeichenfolge in zwei Zeichenketten analysiert. In C # würde ich es wie folgt erklären:

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

, und ich würde es so nennen:

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

Das aktuelle Projekt hat in C ++ / CLI durchgeführt werden. Ich habe versucht,

using System::Runtime::InteropServices;

...

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

aber wenn ich es so nennen:

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

Ich erhalte einen Compiler-Fehler, und wenn ich es so nennen:

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

dann bekomme ich einen Fehler zur Laufzeit. Wie soll ich das erklären und meine Funktion aufrufen?

War es hilfreich?

Lösung

C ++ / CLI selbst kein wirkliches ‚out‘ Argument nicht unterstützt, aber Sie können eine Referenz als Argument aus markieren zu anderen Sprachen sehen es als ein echtes out-Argument zu machen.

Sie können diese für Referenztypen tun, wie:

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

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

Und für Werttypen wie:

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

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

Das% macht es einen ‚ref‘ Parameter und die OutAttribute markiert, dass es nur für Ausgangswerte verwendet wird.

Andere Tipps

Verwenden von Visual Studio 2008, das funktioniert und löste ein großes Problem in meinem Job. Dank!

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

Es wird nicht unterstützt. Die nächstgelegene Sie erhalten können, ist ref

Zugegeben Sie fälschen kann es, aber Sie verlieren eine Kompilierung zu überprüfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top