2 Stimmen

C++/CX-Einschränkungen

Ich möchte eine Bibliothek mit C++/CX-Syntax schreiben und sie in anderen Projekten verwenden.

Wie Sie wissen, können einfache alte Datenstrukturen keine Methoden oder Operatoren haben, so dass wir z. B. statische Methoden in eine andere Klasse schreiben mussten, um Verhalten zu ermöglichen.

Außerdem können wir keinen Code wie diesen schreiben:

private:
    int _D;
public:
    property int& D { int& get() {return _D;}}

oder diese Eigenschaft an Methoden wie diese übergeben:

void SampleMethod(int& d);

Ich weiß nicht, warum die Windows Runtime Library diese Einschränkungen hat.

Wie kann ich C++/CX- und Windows Runtime-Erweiterungen in einer .lib-Datei kompilieren? Oder wie kann ich die Codedateien des gesamten WRL-Projekts in einem anderen Projekt vorkompilieren?

4voto

Pavel Minaev Punkte 97251

WinRT ist eine ABI, die für den sprachübergreifenden Einsatz gedacht ist - zumindest für C++, C#, VB und JS. Aus diesem Grund sind die Konstrukte, die es bietet, auf das beschränkt, was in diesen Sprachen auf einfache Weise dargestellt werden kann - zum Beispiel, wenn Sie durch Referenz zurückkehren, wie würde C#-Code verwenden, dass?

Wenn Sie eine statische Bibliothek in C++ schreiben wollen, die nur von C++ aus genutzt werden kann, würde ich Ihnen raten, Spracherweiterungen so weit wie möglich zu vermeiden und sie nur an den Stellen zu verwenden, an denen Sie WinRT-Objekte weitergeben müssen. Es gibt keinen Vorteil, den Sie in diesem Szenario von gehen voll C++/CX ableiten werden.

3voto

Larry Osterman Punkte 15976

Im Gegensatz zu C++, wo ein "struct" im Grunde "eine Klasse, deren Mitglieder alle öffentlich sind" ist, ist ein "struct" in der Windows-Laufzeitumgebung ein Wertetyp. Als solcher kann er keine Methoden haben, auch keine Eigenschaftszugriffsfunktionen (Werttypen können keine Methoden haben).

Da es sich bei Structs um Werttypen handelt, werden sie außerdem immer als Wert übergeben. Das bedeutet, dass die Übergabe einer struct in eine Methode das Kopieren des Inhalts der struct erfordert (ein Wertetyp impliziert, dass jeder Verbraucher mit seiner eigenen Kopie des Datentyps arbeitet). Dies hat zur Folge, dass structs ziemlich klein sein sollten (denken Sie an "unter 16 Bytes").

Wenn Sie größere Objekte weitergeben müssen, verwenden Sie stattdessen eine Klasse - Klassen werden per Referenz übergeben und können daher jede beliebige Menge an Daten enthalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X