Первоначальная настройка и особенности работы в различных средах разработки описаны в Wiki.
UML-диаграммы (файлы с расширением .xmi
) можно обрабатывать в программе Umbrello.
- Создать иерархию классов, описывающих классификацию животных:
- 3 уровня (например:
Animal
-Mammal
-Cat
), на первом уровнеclass Animal
. - Минимум два дочерних класса для каждого родительского класса.
- В каждом классе создать одно публично (
public
) доступное поле, отражающее уникальность соответствующего таксона. Например, для классаCat
это может быть (средняя) длина вибриссов:float vibrissaLength
.
- 3 уровня (например:
- Создать в
main()
по 1 объекту каждого класса нижнего уровня и установить разумные значения для всех доступных полей в данных объектах. - По образу и подобию кода в
vehicles.h
иvehicles.cpp
:- Добавить функцию
about()
. - Реализовать оператор вывода в поток для
Animal
.
- Добавить функцию
- Сделать все поля приватными, а доступ к ним сделать через пару методов («геттер» и «сеттер»), например:
private:
int foo;
public:
int getFoo() const { return foo; }
void setFoo(int newValue) { foo = newValue; }
- Реализовать конструкторы для всех классов, позволяющие инициализировать все поля каждого класса.
Конструкторы родительских классов должны быть объявлены в области видимости
protected
.
- Реализовать (перегрузить) следующие операции над классом
vector3d
(папкаvectors
):- Бинарные:
+
,-
,*
(умножение на скаляр),/
(деление на скаляр). - Унарные:
-
(инвертирование знака),!
(для входного вектора из одних нулей возвращает вектор из единиц, а для всех остальных входных векторов возвращает вектор из нулей).
- Бинарные:
- Продемонстрировать применение всех перегруженных операций.
- Написать функцию
bool test_vector3d()
, которая должна проверить корректность реализации всех перечисленных выше операций. Для каждой проваленной проверки должна выводиться вstd::cerr
ровно одна поясняющая строка, отображающая, какая операция и с какими данными повела себя неверно. Данную функцию вызвать изmain()
, сделать её результат определяющим для возвращаемого изmain()
значения (0
дляtrue
,1
дляfalse
).
- Реализовать функцию
A::getBString()
, возвращающую значениеB::b_s
(подразумевается, что объект, для которого вызывается, является объектом типаB
). Используйте знание о расположении объектов в памяти. - Реализовать
A::printData()
, выводящую в поток текствое представлениеA::a_s
,B::b_s
иB::data
с помощьюA::getBString()
и аналогичных техник. - Реализовать
A::printData2()
, выводящую в поток текствое представлениеA::a_s
,B::b_s
иB::data
с помощью виртуальных функций.
Для выполнения работы используйте файлы memhacks/newhacks.h
и memhacks/newhacks.cpp
.
Перед выполнением работы следует ознакомиться с программой classwork/newdemo
.
- Реализуйте класс
Foo
, содержащий произвольные поля (не менее двух, разных типов). Реализуйте в нёмoperator new
иoperator delete
, затем убедиться, что они вызываются, путём написания проверочного кода. - Реализуйте классы
Bar
иBuz
, наследующиеFoo
. В классеBar
тоже определитеoperator new
иoperator delete
. - В конструкторах и деструкторах всех классов предусмотреть вывод отладочной информации об их срабатывании.
- Создайте экземпляры всех трёх созданных классов на стеке и в динамической памяти. Изучите поведение программы.
- Запретите создание объектов класса
Buz
в динамической памяти.
- Реализовать
const Pole* Switch::getPole(size_t idx) const
. - Реализовать
Pole* Object::getPole(size_t idx)
. - Реализовать
bool Object::isConnectedTo(const Object& other) const
. - Реализовать
bool Object::connect(const std::string& poleName, const Object& other, const std::string& otherPoleName)
. - Реализовать класс светильника Light с двумя полюсами.
- Реализовать класс генератора с тремя полюсами (фаза, нейтраль, земпя).
- В функции
main()
построить цепь из генератора, выключателя и светильника.