Wertklassen und Strukturen (C++/CX)

Eine Wertstruktur oder Wertklasse ist Windows-Runtime-kompatible POD (Plain Old Data structure). Sie verfügt über eine feste Größe und besteht nur aus Feldern. Anders als eine Verweisklasse hat sie keine Eigenschaften.

Die folgenden Beispiele zeigen, wie Wertstrukturen deklariert und initialisiert werden.


// in mainpage.xaml.h:
    value struct TestStruct
    {
        Platform::String^ str;
        int i;
    };

    value struct TestStruct2
    {
        TestStruct ts;
        Platform::String^ str;
        int i;
    };


// in mainpage.cpp:
    // Initialize a value struct with an int and String
    TestStruct ts = {"I am a TestStruct", 1};

    // Initialize a value struct that contains
    // another value struct, an int and a String
    TestStruct2 ts2 = {{"I am a TestStruct", 1}, "I am a TestStruct2", 2};

    // Initialize value struct members individually.
    TestStruct ts3; 
    ts3.i = 108;
    ts3.str = "Another way to init a value struct.";


Wenn eine Variable eines Werttyps einer anderen Variablen zugewiesen wird, wird der Wert kopiert, damit jede der beiden Variablen eine eigene Kopie der Daten besitzt. Eine Wertstruktur ist eine Struktur fester Größe, die nur öffentliche Datenfelder enthält und durch das Schlüsselwort value struct deklariert wird.

Eine Wertklasse entspricht value struct, außer dass den zugehörigen Felder explizit öffentliche Zugreifbarkeit zugeordnet werden muss. Sie wird durch das Schlüsselwort value class deklariert.

Eine Wertstruktur oder Wertklasse kann als Felder nur grundlegende numerische Typen, Enumerationsklassen, Platform::String^ oder Platform::IBox <T>^ enthalten, wobei T eine Klasse vom Typ numerisch oder eine Enumerationsklasse oder eine Wertklasse oder eine Struktur ist. Ein IBox<T>^-Feld kann den Wert nullptr haben. Auf diese Weise implementiert C++ das Konzept der auf NULL festlegbaren Werttypen.

Da alle Member einer Wertklasse oder Wertstruktur öffentlich sind und in Metadaten ausgegeben werden, sind Standard-C++-Typen nicht zulässig.

Eine Wertklasse oder Wertstruktur, die einen Platform::String^- oder IBox<T>^-Typ als Member enthält, das nicht memcpy-fähig ist.

Da alle Member einer value class oder value struct öffentlich sind und in Metadaten ausgegeben werden, sind C++-Standardtypen als Member nicht zulässig. Dies unterscheidet sich von Verweisklassen, die private oder internal C++-Standardtypen enthalten können.

Im folgenden Codefragment werden die Coordinates- und City-Typen als Wertstrukturen deklariert. Beachten Sie, dass einer der City-Datenmember ein GeoCoordinates-Typ ist. Eine value struct kann andere Wertstrukturen als Member enthalten.


public enum class Continent 
{  
    Africa,
    Asia,
    Australia,
    Europe,
    NorthAmerica,
    SouthAmerica,
    Antarctica 
};

value struct GeoCoordinates
{
    double Latitude; //or float64 if you prefer
    double Longitude;
};

value struct City
{
    Platform::String^ Name;
    int Population;
    double AverageTemperature;
    GeoCoordinates Coordinates;
    Continent continent;
};


Wie bereits erwähnt, können eine Wertklasse oder eine Wertstruktur ein Feld des Typs Platform::IBox<T>^ aufweisen, z. B. IBox<int>^. Ein solches Feld kann jeden beliebigen numerischen Wert haben, der für den Typ int gültig ist, oder er kann den Wert nullptr haben. Sie können ein auf NULL festlegbares Feld als Argument an eine Methode, deren Parameter als optional deklariert ist, oder an eine beliebige andere Stelle übergeben, für die ein Werttyp keinen Wert haben muss.

Im folgenden Beispiel wird veranschaulicht, wie eine Struktur mit einem auf NULL festlegbaren Feld initialisiert wird.

public value struct Student
{
    Platform::String^ Name;
    int EnrollmentYear;
    Platform::IBox<int>^ GraduationYear; // Null if not yet graduated. 
};
//To create a Student struct, one must populate the nullable type. 
MainPage::MainPage()
{
    InitializeComponent();

    Student A;
    A.Name = "Alice";
    A.EnrollmentYear = 2008;
    A.GraduationYear = ref new Platform::Box<int>(2012);


    Student B;
    B.Name = "Bob";
    B.EnrollmentYear = 2011;
    B.GraduationYear = nullptr;

    IsCurrentlyEnrolled(A);
    IsCurrentlyEnrolled(B);
}
bool MainPage::IsCurrentlyEnrolled(Student s)
{
    if (s.GraduationYear == nullptr)
    {
        return true;
    }
    return false;
}

Eine Wertstruktur selbst kann genauso auf NULL festgelegt werden, wie hier dargestellt:


public value struct MyStruct
{
public:
    int i;
    Platform::String^ s;
};

public ref class MyClass sealed
{
public:
    property Platform::IBox<MyStruct>^ myNullableStruct;
};
Anzeigen:
© 2014 Microsoft