Типы анонимных классов

Классы могут быть анонимными— то есть они могут быть объявлены без идентификатора. Это полезно при замене имени typedef класса именем, как показано ниже.

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

Примечание.

Использование анонимных классов, показанное в предыдущем примере, полезно для поддержки совместимости с существующими кодом C. В некоторых кодах C использование в сочетании typedef с анонимными структурами распространено.

Анонимные классы также полезны, если требуется, чтобы ссылка на член класса отображалась так, как если бы она не содержалась в отдельном классе, как показано в следующем примере.

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

PTValue ptv;

В приведенном выше коде iValue можно получить доступ с помощью оператора выбора элементов объекта (.) следующим образом:

int i = ptv.iValue;

Анонимные классы имеют некоторые ограничения. (Дополнительные сведения об анонимных профсоюзах см. в разделе Профсоюзы.) Анонимные классы:

  • Не могут иметь конструктор или деструктор.

  • Невозможно передать в качестве аргументов в функции (если проверка тип проверка поражение с помощью многоточия).

  • Не могут быть возвращены в качестве возвращаемых значений из функций.

Анонимные структуры

Блок, относящийся только к системам Майкрософт

Расширение Microsoft C позволяет объявить переменную структуры в другой структуре без указания ее имени. Эти вложенные структуры называются анонимными структурами. В C++ анонимные структуры не допускаются.

Можно получить доступ к членам анонимной структуры, как если бы они были членами содержащей их структуры.

// 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

Завершение блока, относящегося только к системам Майкрософт