Если посмотреть на полученный файл заголовка, то можно увидеть, что получилось не совсем то, что нужно. Я приведу полученный файл без некоторой служебной информации, которую включает генератор в код класса. Вся служебная информация вставляется как комментарии и не влияет на последующую генерацию исполняемого файла.
Замечание. Вы можете отличить созданные генератором строки по символам «##», вставляемым в комментарии.
# include "Location.h"
# include "Temperature.h"
// Датчик температуры, измеряет температуру в теплице в
// Цельсиях
class TemperatureSensor {
public:
//## Constructors (generated) TemperatureSensor();
TemperatureSensor(const TemperatureSensor &right);
//## Constructors (specified)
TemperatureSensor (Location Location);
//## Destructor (generated)
~TemperatureSensor();
//## Other Operations (specified)
void calibrate(Temperature actualTemperature);
Temperature currentTemperature ();
}
Здесь мы видим, что в код включились заголовочные файлы определения данных и комментарий (это было заполнено поле RClick=>Open Specification=>Documentation). Однако конструкторов в классе целых три: два автоматически созданных и один, который определили мы. И не хватает служебного слова const в операции currentTemperature.
Исправим это несоответствие. Сначала удалим автоматически создаваемые конструкторы класса: Wind: Class Diagram=> TemperatureSensor=> RClick =>OpenSpecification=>C++=> Generate Default Constructor=DoNotDeclare и там же Generate Copy Constructor == DoNotDeclare.
Поставим тип const: Wind:Browser + Logical View + TemperatureSensor=>current-Temperature=>C++=>Operation Is Const=True.
Совет. Для того чтобы быстро выделить нужный класс в окне Browser, находясь в окне Class Diagram, сделайте RCIick=>Select In Browser.
Проверьте полученный исходный код и убедитесь, что все сработало как нужно.
Настройка свойств C++
Пока мы проделали все эти действия без подробных объяснений, для того чтобы показать возможности Rational Rose по созданию кода приложения на C++. Для того чтобы вы могли пользоваться возможностями C++, далее опишем назначение этих свойств, список которых доступен во вкладке C++ спецификаций класса.
· CodeName устанавливает имя класса в создаваемом коде. Данное свойство необходимо устанавливать только в том случае, если имя класса должно быть отлично от имени заданного в модели Rational Rose. Данное свойство необходимо использовать для создания работоспособного кода C++, если для классов в модели используются русские имена.
· ImplementationType позволяет использовать простые типы вместо определения класса, устанавливаемого Rational Rose по умолчанию, При задании этого параметра создается директива typedef.
· ClassKey используется для задания типа класса, такого как class, struct или union. Если тип не указан, то создается класс.
· GenerateEmptyRegion -- свойство указывает, как будет создаваться пустой раздел protected: None — пустой раздел не будут создан; Preserved — пустой раздел будет создан, если будет установлено свойство «preserve=yes»; Unpreserved — пустой раздел будет создан, если будет установлено свойство «preserve=no»; All — всегда будет создаваться.
· PutBodiesInSpec если установлено как True, то в заголовочный файл попадет и описание тела класса. Используется для компиляторов, которым необходимо определение шаблона класса в каждом компилируемом файле.
· GenerateDefaultConstructor позволяет установить, необходимо ли создавать конструктор для класса по умолчанию. Может принимать следующие значения: DeclareAndDefine - создается определение для конструктора и скелет конструктора в теле класса; Declare Only — создается только определение; DoNotDeclare — не создается ни определения, ни скелета конструктора.
· DefaultConstructorVisibility устанавливает раздел, в котором будет определен конструктор по умолчанию: public, protected, private, implementation.
· InlineDefaultConstructor устанавливает, будет ли конструктор по умолчанию создаваться как inline подстановка.
Замечание. Если конструктора по умолчанию нет, то данное свойство не оказывает на код никакого эффекта.
· ExplicitDefaultConstructor устанавливает конструктор по умолчанию как explicit (явно заданный).
· GenerateCopyConstructor устанавливает, будет ли создана копия конструктора.
· CopyConstructorVisibility устанавливает раздел, в котором будет создана копия конструктора.
· InlineCopyConstructor устанавливает, будет ли копия конструктора создаваться как inline подстановка..
· ExplicitCopyConstructor устанавливает, что копия конструктора будет создана explicit (явно задана).
· GenerateDestructor устанавливает, будет ли создаваться деструктор для класса.
· Destructor Visibility устанавливает раздел, где будет создаваться деструктор.
· DestructorKind устанавливает вид создаваемого деструктора: Common — обычный, Virtual — виртуальный, Abstract — абстрактный.
· InlineDestructor устанавливает, будет ли деструктор создаваться как inline подстановка.
· GenerateAssignmentOperation устанавливает, будет ли создаваться функция переопределения оператора присваивания (=).
· AssignmentVisibility определяет раздел, где будет создаваться функция оператора присваивания.
· The AssignmentKind определяет вид функции оператора присваивания: Common -- обычная, Virtual — виртуальная, Abstract - абстрактная, Friend — дружественная.
· InlineAssignmentOperation определяет, будет ли оператор присваивания создаваться как inline.
· GenerateEqualityOperations определяет, будут ли переопределяться операторы сравнения на равенство (= = и!=).
· Equality Visibility определяет раздел, в который будут помещены операторы сравнения на равенство.
· EqualityKind определяет вид функций операторов сравнения на равенство: Common — обычная, Virtual — виртуальная, Abstract — абстрактная, Friend — дружественная.
· InlineEqualityOperations определяют, будут ли функции операторов сравнения на равенство создаваться как inline.
· GenerateRelationalOperations определяет, будут ли переопределяться операторы сравнения (<, <=, >, >=).
· RelationalVisibility определяет раздел, в который будут помещены операторы сравнения.
· RelationalKind определяет вид функций операторов сравнения: Common - - обычная, Virtual — виртуальная, Abstract - - абстрактная, Friend — дружественная.
· InlineRelationalOperations определяет, будут ли функции операторов сравнения создаваться как inline подстановка.
· GenerateStorageMgmtOperations определяет, будут ли переопределяться операторы new и deшlete в классе.
· StorageMgmtVisibility определяет раздел, в который будут помещены операторы new и delete.
· InlineStorageMgmtOperations определяет, будут ли операторы new delete определены как inline подстановка.
· GenerateSubscriptOperation определяет, будет ли переопределен оператор [].
· Subscript Visibility определяет раздел, в который будет помещен оператор [].
· SubscriptKind определяет вид функций оператора []: Common — обычная, Virtual — виртуальная, Abstract — абстрактная.
· SubscriptResultType определяет тип возвращаемого выражения для оператора [].
· InlineSubscriptOperation определяет, будет ли оператор [] определен как inline подстановка.
· GenerateDereferenceOperation определяет, будет ли переопределен оператор *.
· DereferenceVisibility определяет раздел, в который будет помещен оператор *.
· DereferenceKind определяет вид функций оператора *: Common - обычная, Virtual — виртуальная, Abstract — абстрактная.
· DereferenceResultType определяет тип возвращаемого выражения для оператора *.
· InlineDereferenceOperation определяет, будет ли оператор * определен как inline подстановка.
· GeneratelndiшrectionOperation определяет, будет ли переопределен оператор ->.
· Indirection Visibility определяет раздел, в который будет помещен оператор ->.
· IndirectionKind определяет вид функций оператора ->: Common -обычная, Virtual — виртуальная, Abstract — абстрактная.
· IndirectionResultType определяет тип возвращаемого выражения для оператора ->.
· InlinelndirectionOperation определяет, будет ли оператор -> определен как inline подстановка.
· GenerateStreamOperations определяет, будут ли переопределены операторы потоков («и »).
· Stream Visibility определяет раздел, в который будут помещены операторы потоков.
· InlineStreamOperations определяет, будут ли операторы потоков определены как inline подстановка.
Примерные вопросы для самопроверки и защиты
1. Опишите возможности ассоциации класса с языком C++.
2. Возможности установки типа объекта.
3. Опишите порядок добавления операций.
4. Как устанавливаются зависимости классов?
5. Как просмотреть получаемый код, не выходя из Rational Rose.
6. Опишите настройки свойств C++.
Литература
1. Трофимов С.А. Case -технологии: практическая работа в Rational Rose — М.: ЗАО «Издательство БИНОМ», 2001 г. — 272 с.: ил.