ООП c++
Шаблоны классов с++ примеры. Обобщенные классы.
https://www.youtube.com/watch?v=SDRMUgJwro0
Если делаешь только то, что умеешь, то никогда не сможешь превзойти самого себя
https://s.hardprivate.com/
Код: Выделить всё
class stack
{
public:
stack(int size); // Конструктор
~stack(); // Деструктор Очищает память
void push(int a); // <-| Добавляет элемент в стэк
int pop(); // <-|- Методы
void clear(); // <-| Сбрасывает память в 0
private:
int size; // Размер стэка
int* data; // Указатель на данные
int top; // Верхний элемент
};
Код: Выделить всё
stack::stack(int stack_size)
{
this->top = 0;
this->size = stack_size;
this->data = new int[stack_size];
}
Код: Выделить всё
stack::~stack()
{
delete[] this->data;
}
Код: Выделить всё
void stack::push(int a)
{
if(this->top == this->size)
{
cout << "Стэк заполнен" << endl;
return;
}
this->data[this->top] = a;
this->top++;
}
Код: Выделить всё
{
stack s1(10); // Инициализация стэка на 10 элементов
s1.push(1); // Добавление элемента в стэк
si.push(2);
cout << s1.pop << endl;
cout << s1.pop << endl;
}
Код: Выделить всё
class Animal
{
protected: // Закрывает доступ всем снаружи и открывает доступ только своим потомкам (промежуточный вариант между private и public)
bool brain;
public:
Animal() { this->brain = true; }
void say() { cout << " (silence) " << endl; }
bool hasBrain() { return brain; }
};
Код: Выделить всё
class Turtle: public Animal
{
public:
Turtle() { }
};
Код: Выделить всё
class Crow: public Animal
{
public:
Crow() { }
void say() // Перекрыли метод предка и добавили своё поведение
{
cout << "Moo" << endl;
}
};
Код: Выделить всё
class Dog: public Animal
{
public:
Dog() { }
void say() // Перекрыли метод предка и добавили своё поведение
{
cout << "Woof" << endl;
}
};
Код: Выделить всё
class CrazyDog: public Dog
{
public:
CrazyDog() { this->brain = false; }
void say() // Перекрыли метод предка и добавили своё поведение
{
cout << "Woof,Woof,Woof" << endl;
}
};
Код: Выделить всё
int main
{
Turtle t;
return 0;
}
Код: Выделить всё
class Figure // Данный класс является абстрактным, потому что содержит в себе метод без реализации
{
protected: // К этому свойству имеют доступ все потомки этого класса
float wight;
public:
float getWeight() // Позволяет получить доступ на чтение снаружи: геттер
{
return weight;
}
// Синтаксис равно нулю - это сигнал компилятору, что реализацию дальше не ожидать
virtual float square() = 0; // Виртуальный метод обязан быть реализован в потомке
};
Код: Выделить всё
class Triangle: public Figure
{
// ...
float square()
{
float p = (a+b+c)/2
return sqrtf(p*(p-a)*(p-b)*(p-c));
}
};
class Rectangle: public Figure
{
//...
float square() { return a*b; }
};
Код: Выделить всё
{
Figure* figs[15]; // Массив указателей на объекты базового типа Figure
//...
// По каждому указателю кладёте объекты производных типов
// т.е. указатель на тип предка, а реализация тип потомка
//...
// Для каждого метода будет вызвана своя реализация
for(int i=0; i<15; i++)
cout << figs[i]->square() << endl;
}
Код: Выделить всё
Animal* animal = new CrazyDog();
cout << animal->hasBrain() << endl;
animal->say();
Код: Выделить всё
int doSomeWork();
Код: Выделить всё
namespace A
{
int doSomeWork();
}
Код: Выделить всё
{
doSomeWork();
A::doSomeWork();
}
Код: Выделить всё
namespace A
{
void hello();
namespace B
{
void hello();
}
}
Код: Выделить всё
{
A::hello();
A::B::hello();
}
Код: Выделить всё
using namespace A;
Код: Выделить всё
{
hello();
B::hello();
}
Код: Выделить всё
using A::B::hello;
Код: Выделить всё
class A
{
// Теперь B - друг A, и ему всё можно в классе А
friend class B;
};
class B
{
public:
void run(A* a)
count << a->secret << endl;
a->secret = -1;
}
Код: Выделить всё
class IBade
{
virtual ~IBase() = default;
}
class TestClass: public IBase
{
public:
~TestClass();
};
// Теперь деструктор будет корректно вызван
IBase* obj2 = new TestClass(100);
delete obj2;
Код: Выделить всё
class IBase
{
public:
virtual void describe(bool foo) = 0;
};
class ClassA : public IBase
{
public:
// Перекрытие метода с аргументами и без аргументов - это разные методы, соответственно компилятор выдаст ошибку
void desctibe() override final;
}
class ClassC final: public ClassA // тут final указывает, что дальше от этого класса наследоваться нельзя
{
public:
// тоже ошибку выдаст, потому что final в родительском классе
void describe() override;
}
Код: Выделить всё
class Animal // Интерфейс для движка
{
virtual void move() = 0;
};
class Drawing //Интерфейс для визуализатора
{
virtual void show() = 0;
};
// Реализация интерфейсов
class Snake : public Animal , public Drawing
{
public:
void move() override;
void show() override;
};
Код: Выделить всё
// Первый вариант позволяет наследовать интерфейс от Animal
Animal* a = new Snake();
a->move();
//Второй вариант позволяет наследовать интерфейс от Drawing
Drawing* d = new Snake();
d->show();
Код: Выделить всё
class TestClass : public A, public B { ... };
...
{
TestClass t;
// t.describe(); - неявное обращение к методу
t.A::describe(); // явное обращение к методу
t.B::describe(); // явное обращение к методу
}
Код: Выделить всё
class Person { ... };
class Faculty : virtual public Prson { ... };
class Student : virtual public Prson { ... };
class Mentor: public Faculty, public Student { ... };
Код: Выделить всё
{
Figure * figs[15];
for (int i=0; i>15; i++)
cout << figs[i]->square() << endl;
}