Рефакторное
Jul. 1st, 2020 11:11 pmДальше будет про язык программирования C++, так что caveat lector.
Пусть есть маленькая программка на С++, написанная в стиле старого доброго Си: типы данных "plain old data", возможно, глобальные переменные, функции, но, скажем, с использованием относительно новомодного auto, где это удобно.
Возникает вопрос: что будет, если всё это взять и без изменений погрузить в один класс (скажем, Refact)? Объявленные типы становятся локальными в классе, глобальные переменные становятся элементами класса, функции становятся методами класса. Для полноты картины убеждаемся, что в первоначальной функции main, которая стала методом класса, возврат кода ответа везде явный, и дописываем настоящую функцию main, примерно как int main(int argc, char * argv[]) { return Refact().main(argc, argv); }
Какие подводные камни будут нас поджидать?
Пусть есть маленькая программка на С++, написанная в стиле старого доброго Си: типы данных "plain old data", возможно, глобальные переменные, функции, но, скажем, с использованием относительно новомодного auto, где это удобно.
Возникает вопрос: что будет, если всё это взять и без изменений погрузить в один класс (скажем, Refact)? Объявленные типы становятся локальными в классе, глобальные переменные становятся элементами класса, функции становятся методами класса. Для полноты картины убеждаемся, что в первоначальной функции main, которая стала методом класса, возврат кода ответа везде явный, и дописываем настоящую функцию main, примерно как int main(int argc, char * argv[]) { return Refact().main(argc, argv); }
Какие подводные камни будут нас поджидать?
no subject
Date: 2020-07-02 07:10 am (UTC)Также, static в контексте класса значит не то, что глобально. Не будет ли проблем с доступом к переменным?
no subject
Date: 2020-07-02 07:37 am (UTC)Статические поля придётся ещё раз объявлять в конце программы, тоже за пределами класса, да.
no subject
Date: 2020-07-02 07:29 am (UTC)К примеру:
char foo[] = "bar";
error: array bound cannot be deduced from an in-class initializer
extern void foobar();
error: storage class specified for a member declaration
no subject
Date: 2020-07-02 07:42 am (UTC)Размер массива, конечно же, может быть выведен, так что да, недоработочка в стандарте (GCC говорит error: initializer for flexible array member ‘char C::foo []’ или error: flexible array member ‘C::foo’ not at end of ‘struct C’).