Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Конструктор классов отображает область визуального конструктора, называемую схемой классов , которая предоставляет визуальное представление элементов кода в проекте. Схемы классов можно использовать для проектирования и визуализации классов и других типов в проекте.
Конструктор классов поддерживает следующие элементы кода C++:
Класс (напоминает фигуру управляемого класса, за исключением того, что она может иметь несколько связей наследования)
Анонимный класс (отображает созданное представление класса для анонимного типа)
Класс шаблон
Структура
Enum
Макрос (отображает представление макроса после обработки)
Типопределение
Замечание
Это не то же самое, что и схема классов UML, которую можно создать в проекте моделирования. Дополнительные сведения см. в разделе "Схемы классов UML: справочник".
Классы C++ в конструкторе классов
Конструктор классов поддерживает классы C++ и визуализирует собственные классы C++ так же, как и фигуры классов Visual Basic и C#, за исключением того, что классы C++ могут иметь несколько связей наследования. Вы можете развернуть фигуру класса, чтобы отобразить больше полей и методов в классе, или свернуть её, чтобы сэкономить пространство.
Замечание
Конструктор классов не поддерживает объединения (особый тип класса, в котором выделенная память является только объемом, необходимым для крупнейшего члена данных объединения).
Простое наследование
При перетаскивании нескольких классов на диаграмму классов, и если классы имеют отношение наследования, стрелка соединяет их. Стрелка указывает в направлении базового класса. Например, если в схеме классов отображаются следующие классы, стрелка подключает их, указывая от B к A:
class A {};
class B : A {};
Вы также можете перетащить только класс B на схему классов, щелкните правой кнопкой мыши фигуру класса для B и выберите команду "Показать базовые классы". Отображается базовый класс: A.
Несколько наследований
Конструктор классов поддерживает визуализацию связей наследования нескольких классов. Множественное наследование используется, когда производный класс имеет атрибуты нескольких базовых классов. Ниже приведен пример нескольких наследования:
class Bird {};
class Swimmer {};
class Penguin : public Bird, public Swimmer {};
При перетаскивании нескольких классов на диаграмму, если у классов есть отношение множественного наследования, стрелка соединяет их. Стрелка указывает в направлении базовых классов.
Щелкните правой кнопкой мыши фигуру класса, а затем выберите "Показать базовые классы " для выбранного класса.
Замечание
Команда ShowПроизводные классы не поддерживается для кода C++. Производные классы можно отобразить, перейдя в представление классов, расширив узел типа, расширив вложенную папку "Производные типы ", а затем перетащив эти типы на схему классов.
Дополнительные сведения о множественном наследовании см. раздел "Множественное наследование" и "Множественные базовые классы".
Абстрактные классы
Конструктор классов поддерживает абстрактные классы (также называются абстрактными базовыми классами). Это классы, которые никогда не создаются экземплярами, но из которых можно получить другие классы. Используя пример из "Множественное наследование" ранее в этом документе, можно создавать экземпляры класса Bird как отдельные объекты следующим образом:
int main()
{
Bird sparrow;
Bird crow;
Bird eagle;
}
Однако вы можете не намереваться создавать экземпляры класса Swimmer в виде отдельных объектов. Вы можете намереваться использовать этот класс только для вывода других типов классов животных, например, Penguin, Whale и Fish. В этом случае объявите класс Swimmer как абстрактный базовый класс.
Чтобы объявить класс абстрактным, можно использовать ключевое abstract слово. Члены, помеченные как абстрактные или включенные в абстрактный класс, являются виртуальными и должны быть реализованы классами, производными от абстрактного класса.
class Swimmer abstract
{
virtual void swim();
void dive();
};
Можно также объявить класс абстрактным, включив по крайней мере одну чистую виртуальную функцию:
class Swimmer
{
virtual void swim() = 0;
void dive();
};
При отображении этих объявлений на схеме классов имя Swimmer класса и ее чистая виртуальная функция swim отображаются в курсиве в форме абстрактного класса вместе с нотацией абстрактного класса. Обратите внимание, что фигура типа абстрактного класса совпадает с фигурой обычного класса, за исключением того, что ее граница является пунктирной линией.
Класс, производный от абстрактного базового класса, должен переопределить каждую чистую виртуальную функцию в базовом классе, иначе создать экземпляр производного класса будет невозможно. Например, если вы наследуете Fish класс из Swimmer класса, Fish необходимо переопределить swim метод:
class Fish : public Swimmer
{
void swim(int speed);
};
int main()
{
Fish guppy;
}
При отображении этого кода в диаграмме классов Конструктор классов рисует линию наследования от Fish к Swimmer.
Анонимные классы
Конструктор классов поддерживает анонимные классы. Анонимные типы классов — это классы, объявленные без идентификатора. Они не могут иметь конструктор или деструктор, не могут передаваться в качестве аргументов в функции и не могут быть возвращены в качестве возвращаемых значений из функций. Анонимный класс можно использовать для замены имени класса именем typedef, как показано в следующем примере:
typedef struct
{
unsigned x;
unsigned y;
} POINT;
Структуры также могут быть анонимными. Конструктор классов отображает анонимные классы и структуры, аналогичные отображению соответствующего типа. Хотя можно объявить и отобразить анонимные классы и структуры, конструктор классов не будет использовать указанное имя тега. Он будет использовать имя, которое создает Class View. Класс или структура отображаются в представлении классов и конструкторе классов в качестве элемента , называемого __unnamed.
Дополнительные сведения об анонимных классах см. в разделе "Типы анонимных классов".
Классы шаблонов
Конструктор классов поддерживает визуализацию классов шаблонов. Поддерживаются вложенные объявления. В следующей таблице показаны некоторые типичные объявления.
| Элемент кода | Представление конструктора классов |
|---|---|
template <class T>class A {}; |
A<T>Класс шаблона |
template <class T, class U>class A {}; |
A<T, U>Класс шаблона |
template <class T, int i>class A {}; |
A<T, i>Класс шаблона |
template <class T, template <class K> class U>class A {}; |
A<T, U>Класс шаблона |
В следующей таблице показаны некоторые примеры частичной специализации.
| Элемент кода | Вид конструктора классов |
|---|---|
template<class T, class U>class A {}; |
A<T, U>Класс шаблона |
template<class T>class A<T, T> {}; |
A<T, T>Класс шаблона |
template <class T>class A<T, int> {}; |
A<T, int>Класс шаблона |
template <class T1, class T2>class A<T1*, T2*> {}; |
A<T1*, T2*>Класс шаблона |
В следующей таблице показаны некоторые примеры наследования в частичной специализации.
| Элемент кода | Представление конструктора классов |
|---|---|
template <class T, class U>class A {};template <class TC>class A<T, int> {};class B : A<int, float>{};class C : A<int, int>{}; |
A<T, U>Класс шаблона BClass (указывает на класс A) CClass (указывает на класс A) |
В следующей таблице показаны некоторые примеры функций шаблона частичной специализации.
| Элемент кода | Представление конструктора классов |
|---|---|
class A{template <class T, class U>void func(T a, U b);template <class T>void func(T a, int b);}; |
Afunc<T, U> (+ 1 перегрузка) |
template <class T1>class A {template <class T2>class B {};};template<> template<>class A<type>::B<type> {}; |
A<T1>Класс шаблона B<T2>Класс шаблона (B содержится в классе A в разделе Вложенные типы) |
template <class T>class C {};class A : C<int> {}; |
AClass -> C<int> C<T>Класс шаблона |
В следующей таблице показаны некоторые примеры наследования шаблонов.
| Элемент кода | Вид конструктора классов |
|---|---|
template <class T>class C {};template<>class C<int> {class B {};}class A : C<int>::B {}; |
AClass ->B C<int>Class (B содержится в классе C в разделе 'Вложенные типы') C<T>Класс шаблона |
В следующей таблице показаны некоторые примеры канонических подключений специализированных классов.
| Элемент кода | Представление конструктора классов |
|---|---|
template <class T>class C {};template<>class C<int> {};class A : C<int> {};class D : C<float> {}; |
AClass ->C<int> C<int>Class C<T>Класс шаблона DClass ->C<float> |
class B {template <class T>T min (const T &a, const T &b);}; |
Bmin <T> |
Перечисления C++ в конструкторе классов
Конструктор классов поддерживает C++ enum и ограниченные типы enum class. Ниже приведен пример:
enum CardSuit {
Diamonds = 1,
Hearts = 2,
Clubs = 3,
Spades = 4
};
// or...
enum class CardSuit {
Diamonds = 1,
Hearts = 2,
Clubs = 3,
Spades = 4
};
Фигура перечисления C++ на схеме классов выглядит и работает как фигура структуры, за исключением того, что метка гласит Enum или класс Enum, она розовая вместо синей и имеет цветную границу на левых и верхних полях. Фигуры перечисления и фигуры структуры имеют квадратные угла.
Дополнительные сведения об использовании enum типа см. в разделе "Перечисления".
Типдефы C++ в конструкторе классов
Операторы typedef создают один или несколько слоев косвенной адресации между именем и его базовым типом.
Конструктор классов поддерживает типы typedef C++, объявленные ключевым словом typedef, например:
typedef class coord
{
void P(x,y);
unsigned x;
unsigned y;
} COORD;
Затем этот тип можно использовать для объявления экземпляра:
COORD OriginPoint;
Фигуры классов и структур
В Class Designer C++ 'typedef' имеет форму типа, указанного в 'typedef'. Если источник объявляет typedef class, фигура имеет округленные углы и метку Class. Фигура имеет квадратные углы и метка Struct.
Классы и структуры могут содержать вложенные typedef'ы, объявленные внутри них. В конструкторе классов фигуры классов и структуры могут отображать вложенные объявления typedef в виде вложенных фигур.
Фигуры Typedef поддерживают команды Show as Association и Show as Collection Association в контекстном меню.
Пример typedef класса
class B {};
typedef B MyB;
Пример typedef структуры
typedef struct mystructtag
{
int i;
double f;
} mystruct;
Неименованные определения типов
Несмотря на то, что можно объявить typedef без имени, конструктор классов не использует указанное имя тега. Конструктор классов использует имя, которое генерирует Class View. Например, следующее объявление допустимо, но оно отображается в представлении классов и конструкторе классов в качестве объекта с именем __unnamed:
typedef class coord
{
void P(x,y);
unsigned x;
unsigned y;
};
Замечание
Конструктор классов не отображает typedefs, исходный тип которого является указателем функции.
Сведения об ограничениях для элементов кода C++
При загрузке проекта C++ конструктор классов работает только для чтения. Можно изменить схему классов, но вы не можете сохранить изменения из схемы классов обратно в исходный код.
Конструктор классов поддерживает только собственные семантики C++ . Для проектов C++, скомпилированных в управляемый код, конструктор классов будет визуализировать только элементы кода, которые являются собственными типами. Таким образом, можно добавить схему классов в проект, но конструктор классов не позволит визуализировать элементы, в которых
IsManagedсвойство заданоtrue(то есть типы значений и ссылочные типы).Для проектов C++ конструктор классов считывает только определение типа. Например, предположим, что вы определяете тип в файле заголовка (H) и определяете его члены в файле реализации (.cpp). Если вызвать "Просмотр диаграммы классов" для файла реализации (.cpp), Дизайнер классов ничего не отображает. В другом примере, если вызвать "Просмотр диаграммы классов" для .cpp файла, который использует
#includeинструкцию для включения других файлов, но не содержит фактических определений классов, Конструктор классов снова ничего не отображает.Файлы IDL (IDL), определяющие интерфейсы COM и библиотеки типов, не отображаются на схемах, если они не компилируются в машинном коде C++.
Конструктор классов не поддерживает глобальные функции и переменные.
Конструктор классов не поддерживает объединения. Это особый тип класса, в котором выделенная память — это только объем, необходимый для крупнейшего члена данных объединения.
Конструктор классов не отображает базовые типы данных, такие как
intиchar.Конструктор классов не отображает типы, определенные вне текущего проекта, если проект не имеет правильных ссылок на эти типы.
Конструктор классов может отображать вложенные типы, но не связи между вложенным типом и другими типами.
Конструктор классов не может отображать типы, которые являются пустыми или производными от типа void.
Устранение проблем с определением типов и их отображением
Расположение исходных файлов
Конструктор классов не отслеживает расположение исходных файлов. Таким образом, если вы измените структуру вашего проекта или переместите исходные файлы в проекте, Конструктор классов может потерять отслеживание типов (особенно типа исходных файлов, базовых классов или типов ассоциаций). Может появиться сообщение об ошибке, например Class Designer не может отобразить этот тип. Если это сделать, перетащите измененный или перемещенный исходный код на схему классов снова, чтобы повторно воспроизвести его.
Проблемы с обновлением и производительностью
Для проектов C++ может потребоваться от 30 до 60 секунд, чтобы изменить исходный файл на схеме классов. Эта задержка также может привести к возникновению ошибки Class DesignerТипы не были найдены в выборе. Если вы получаете сообщение об ошибке, нажмите кнопку "Отмена " в сообщении об ошибке и дождитесь появления элемента кода в представлении классов. После этого конструктор классов должен иметь возможность отображать тип.
Если схема классов не обновляется с изменениями, внесенными в код, может потребоваться закрыть схему и снова открыть ее.
Проблемы с разрешением типов
Конструктор классов может не определять типы по следующим причинам:
Тип находится в проекте или сборке, на которую не ссылается проект, содержащий схему классов. Чтобы исправить эту ошибку, добавьте ссылку на проект или сборку, содержащую тип. Дополнительные сведения см. в разделе "Управление ссылками в проекте".
Тип не находится в правильной области, поэтому конструктор классов не может найти его. Убедитесь, что в коде не отсутствует оператор
using,importsили#include. Кроме того, убедитесь, что вы не переместили тип (или связанный тип) из пространства имен, в котором он был первоначально расположен.Тип данных не существует (или был закомментирован). Чтобы исправить эту ошибку, убедитесь, что вы не закомментировали или не удалили тип.
Тип находится в библиотеке, на которую ссылается директива #import. Возможное решение заключается в том, чтобы вручную добавить созданный код (tlh-файл) в директиву #include в файл заголовка.
Убедитесь, что конструктор классов поддерживает введенный тип. См. ограничения для элементов кода C++.
Наиболее вероятная ошибка, с которой вы можете столкнуться при возникновении проблемы разрешения типов, будет код не найден для одной или нескольких фигур в диаграмме классов "<элемент>". Это сообщение об ошибке не обязательно указывает на ошибку кода. Это указывает только на то, что дизайнер классов не смог отобразить ваш код. Попробуйте выполнить следующие меры:
Убедитесь, что тип существует. Убедитесь, что вы не случайно закомментировали или удалили исходный код.
Попробуйте определить тип. Тип может находиться в проекте или сборке, на которую не ссылается проект, содержащий схему классов. Чтобы исправить эту ошибку, добавьте ссылку на проект или сборку, содержащую тип. Дополнительные сведения см. в разделе "Управление ссылками в проекте".
Убедитесь, что тип находится в правильной области, чтобы конструктор классов смог найти его. Убедитесь, что в коде не упущено утверждение
using,importsили#include. Кроме того, убедитесь, что вы не переместили тип (или связанный тип) из пространства имен, в котором он был первоначально расположен.
Подсказка
Дополнительные сведения об устранении неполадок см. в разделе об ошибках конструктора классов.