Udostępnij za pośrednictwem


Anonimowe typy klas

Klasy mogą być anonimowe — oznacza to, że można je zadeklarować bez identyfikatora. Jest to przydatne, gdy zastąp typedef nazwę klasy nazwą, tak jak w następujących przypadkach:

typedef struct
{
    unsigned x;
    unsigned y;
} POINT;

Uwaga

Użycie klas anonimowych pokazanych w poprzednim przykładzie jest przydatne do zachowania zgodności z istniejącym kodem języka C. W niektórych kodzie C użycie typedef w połączeniu ze strukturami anonimowymi jest powszechne.

Klasy anonimowe są również przydatne, gdy chcesz, aby odwołanie do składowej klasy było wyświetlane tak, jakby nie było zawarte w oddzielnej klasie, jak w następujących przypadkach:

struct PTValue
{
    POINT ptLoc;
    union
    {
        int  iValue;
        long lValue;
    };
};

PTValue ptv;

W poprzednim kodzie iValue można uzyskać dostęp przy użyciu operatora wyboru elementu członkowskiego obiektu (.) w następujący sposób:

int i = ptv.iValue;

Klasy anonimowe podlegają pewnym ograniczeniom. (Aby uzyskać więcej informacji na temat anonimowych związków zawodowych, zobacz Unions.) Klasy anonimowe:

  • Nie można mieć konstruktora ani destruktora.

  • Nie można przekazać jako argumentów do funkcji (chyba że sprawdzanie typów zostanie pokonane przy użyciu wielokropka).

  • Nie można zwrócić wartości zwracanych z funkcji.

Anonimowe struktury

Specyficzne dla firmy Microsoft

Rozszerzenie Microsoft C umożliwia zadeklarowanie zmiennej struktury w innej strukturze bez podawania jej nazwy. Te zagnieżdżone struktury są nazywane strukturami anonimowych. Język C++ nie zezwala na struktury anonimowe.

Dostęp do elementów członkowskich struktury anonimowej można uzyskać tak, jakby były członkami w strukturze zawierającej.

// anonymous_structures.c
#include <stdio.h>

struct phone
{
    int  areacode;
    long number;
};

struct person
{
    char   name[30];
    char   gender;
    int    age;
    int    weight;
    struct phone;    // Anonymous structure; no name needed
} Jim;

int main()
{
    Jim.number = 1234567;
    printf_s("%d\n", Jim.number);
}
//Output: 1234567

END Microsoft Specific