// Защита от повторного включения
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
// Пара include’ов
#include <QWidget>
#include <QMainWindow>
// Определение UI-класса наперёд, чтобы визуальное редактирование не приводило
// к крупным перекомпиляциям
namespace Ui {
class MainWindow;
}
// Собственно класс формы
class MainWindow : public QMainWindow
{
// Макрос, который добавляет файл в компиляцию MOC’ом,
// а также реализует пару функций
Q_OBJECT
public:
// Конструктор-деструктор.
// Форма семантически не эквивалентна parent’у,
// потому конструктор explicit
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
// Слоты — фишка Qt, которая обрабатывается MOC’ом
private slots:
private:
// Указатель на UI (для него в Qt есть ещё одна программа, UIC)
Ui::MainWindow *ui;
};
// Защита от повторного включения
#endif // MAINWINDOW_H
Ratio(int x);
, но explicit Array(int x);
: при построении рационального числа из целого будет полный эквивалент, но при построении массива — нет. *i + key - 97 < 0
(*i + key - 97) % 26 < 0
97 = 'a'
. Например, 'W'.(*i + key - 'a') % 26 + 'a'
. typedef struct ttime {
int hours; int minute; int sec;
struct date {
ttime time;
которая в свою очередь входит в состав структуры Date.Странно, ведь это не дата, а скорее Clock — часы.
Методы позволяют изменять текущее время
#pragma pack(1)
struct FileHeader
struct MAPINFO
Rest::function(char * function_name, int (App::* f)(String), App& object)
// вместо App можно какой-то интерфейс, который App реализует
…
object.*f("string");
...
bt_rest.function("", &App::startManufacturing, *this);
class App {
static int startManufacturing(String command)
};
Rest::function(char * function_name, int (*f)(String, void*), void*);
void doStartManufacturing(String command, void* closure) {
reinterpret_cast<App*>(closure)->startManufacturing(command);
}
...
bt_rest.function("startManufacturing", doStartManufacturing, this);
App app;
int doStartManufacturing(String command) { return app.startManufacturing(command); }
...
bt_rest.function("startManufacturing", doStartManufacturing);
class ComparatorBase
{
public:
virtual ~ComparatorBase() = default;
};
class Comparator : public ComparatorBase {
public:
virtual int compare(Comparator *t)=0;
};
class User : public Comparator{
public:
int compare(ComparatorBase *u) override {
return 1;
}
};
class Father
{
public:
virtual Father& foo();
virtual ~Father() = default;
};
class Son : public Father
{
public:
Son& foo() override;
};
int User::compare(Comparator *u)
{
auto* v = dynamic_cast<User*>(u);
if (!v)
return false;
return v->name > this->name;
}
template <class T>
class Comparator {
public:
virtual int compare(T *t)=0;
virtual ~Comparator() = default;
};
class User : public Comparator<User> {
private:
std::string name;
public:
User(std::string name){this->name=name;}
int compare(User *u);
void showName(){std::cout<<"Name "<<this->name<<std::endl;}
};
int User::compare(User *u)
{
return u->name > this->name;
}
center_pt = *new Point(x/size, y/size);
center_pt = Point(x/size, y/size);
class Geolocator {
public:
Point coords;
bool isReliable;
Geolocator() : coords(0,0), isReliable(false) {}
void getFromSensor() {
coords = Point(100, 100);
isReliable = true;
}
};
class Geolocator {
public:
std::unique_ptr<Point> coords;
void getFromSensor() {
Point pt(100, 100);
if (coords) {
*coords = pt;
} else {
coords.reset(new Point(pt));
}
// а если и операции = у Point нет, то можно
// coords.reset(new Point(100, 100));
}
void declareUnreliable() {
coords.reset();
}
};
bool isPreciseFloat(unsigned long long n)
{
// Простейшая проверка: стираем нижние 24 бита
// Если в них вписываемся — ДА.
unsigned long long n1 = n & ~((1ULL << 24) - 1);
if (n1 == 0)
return true;
// Получаем верхнюю единицу
// (можно также двоичным поиском, но я этого с листа не напишу)
while (true) {
unsigned long long n2 = n1 & (n1 - 1);
if (n2 == 0)
break;
n1 = n2;
}
// Получаем маску всего, что ниже 23 бит от верхнего бита.
n1 >>= 23;
--n1;
// Проверяем по маске
return (n & n1) == 0;
}