Первоначальная настройка и особенности работы в различных средах разработки описаны в 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()построить цепь из генератора, выключателя и светильника.