233

Советы падаванам C++ ( Часть 2 )

///////////////////////////////////////////////////

// Начальный курс создания компьютерных игр на C/C++

[0][1][2][2.5][3][4][5][5.5][6][6.2][7][7.2][8][9][9.2][10]

///////////////////////////////////////////////////

// Советы падаванам C++

[1]



Всем привет! :]


После первого поста количество подписчиков резко увеличилось в два раза, поэтому я решил не тянуть со вторым постом. :]

Сегодня в рубрике "Советы падаванам C++" у нас будут советы-привычки - те вещи, к которым нужно привыкнуть как можно раньше и использовать каждый день :]

Жду ваши отзывы в комментариях :]


И вот вам в тему пару весёлых картинок напоследок:

Лига программистов C/C++

66 постов4.8K подписчиков

Правила сообщества

Соблюдайте правила Pikabu:

https://pikabu.ru/html.php?id=wtf


Помимо этого ЗАПРЕЩЕНО:

- Размещать в сообществе посты стиля "Подскажите как удалить вирус", "Подскажите как установить программу", "Подскажите как починить монитор/телевизор/мышь/тостер/стиральную машину" или "Напишите за меня лабу в универ". Пожалуйста размещайте такие посты вне этого сообщества или в соответствующих для этого сообществах.

2
Автор поста оценил этот комментарий

Господи, почему у меня не выходит этим заинтересоваться. Постов на пикабу много на тему программирования, разные советы дают, но продержаться в самостоятельном изучении более таки парочки глав по стандартным книжкам не выходит

Вдруг у вас есть какой-то секрет? Откуда черпаете интерес в программировании?

раскрыть ветку (1)
3
Автор поста оценил этот комментарий

Из креативности :) Моя тяга пошла от конструктора Lego, но вечно не хватало деталек для масштабных проектов )) Пришлось изучить программирование :))

1
Автор поста оценил этот комментарий

выглядит сложновато для обучающей разработки. неужели это будет?

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Ну только если в очень далеком будущем :)) Сейчас эта игра - это моя основная работа.. Работа, отнимающая по 12 часов в день даже на выходных... Поэтому о новых постах на Пикабу даже думать нет сил :) Вот надеюсь, что после релиза ситуация начнет немного меняться :)
показать ответы
1
Автор поста оценил этот комментарий
публика все еще ждет пост курс создания игр на с++ для падаванов часть 1
раскрыть ветку (1)
2
Автор поста оценил этот комментарий

знаю... =( А я жду релиза своего проекта для этого :)

Иллюстрация к комментарию
показать ответы
1
Автор поста оценил этот комментарий

Если вам не будет сложно, подскажите русскоязычную литературу по SFML для C++

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Если честно, то никогда не искал, поэтому не могу ничего подсказать :)
показать ответы
1
DELETED
Автор поста оценил этот комментарий

Маловато инфы о предупреждениях

GCC и его флаги могут выдавать мощную инфу там где предупреждения, там где могут быть возможные переполнения, выходы за пределы и прочее

-Warray-bounds

-Wstrict-overflow=1

и прочие флаги.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Не желаете написать об этом мини-пост в сообществе? :)

6
Автор поста оценил этот комментарий

В C++ есть четыре вида приведений:


static_cast<TypeTo>(originalObj);


dynamic_cast<TypeTo>(originalObj);


reinterpret_cast<TypeTo>(originalObj);


const_cast<TypeTo>(originalObj);

static_cast - это "стандартное" приведение между типами, зашитое на этапе компиляции, использующее стандартный алгоритм или операторы приведения, определенные пользователем.

double d = 123.5;

int i = static_cast<int>(d); // 123

dynamic_cast нужен как раз для приведения указателей в рантайме в рамках иерархии наследования. Классы приводимых указателей должны быть полиморфными (иметь хотя бы одну виртуальную функцию-член). Если это условие не выполняется - ошибка на этапе компиляции. Если приведение невозможно - возвратит nullptr. Также можно приводить ссылки, в случае если для них невозможно приведение - вызывается исключение std::bad_cast.

class A {}; // virtual

class B : public A {}; // virtual


A* bobj = new B;

B* castedB = dynamic_cast<B*>(bobj);

reinterpret_cast - просто простит компилятор относиться к некоторой переменной как к другому типу, без каких-либо преобразований и проверок, "как есть".

file.write(reinterpret_cast<char*>( &value ), sizeof(int)); // запись целого в файл (fstream)

const_cast - позволяет снимать или добавлять cv-квалификаторы (const и volatile). Редко используется, т.к. это своего рода "костыль". Писать в константы так едва ли получится, но если этот объект изначально не был константой, но на него навесили const, то снять его вполне можно:

class A {

int value;

public:

A(int aValue)

: value(aValue)

{

}

const int* getValue() const { return value; }

};



A a(3);

int *changeble = const_cast<int*>(a.getValue());

*changeble = 333;

По поводу C-style приведений vs C++-style


С-style приведение, по сути, это некий "комбайн", который пытается сделать все возможное, чтобы привести типы. Чем и опасен.


C++-style:

static_cast<int>(d);

+ легче читаются: точно и с первого взгляда можно сказать что происходит;

+ в соответствии с правилами приведений здесь больше проверок компилятора - позволяет избежать ошибок;

+ легче искать по коду: искать подстроку, например, "reinterpret_cast" легче, чем некий тип в скобках, который может ипользоваться как тип шаблона, аргумент decltype и в других интересных местах.


С-style:

(int)d

+ более наглядны в сложных математических выражениях

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Ну хз, на мой взгляд (int) все-таки более читаем и нагляден чем static_cast<int>... Поэтому static_cast использую только там где он действительно нужен. Впрочем думаю дело вкуса. :)

показать ответы
1
Автор поста оценил этот комментарий

Прочитал ещё раз пример, кажись допёр. Это в случае, если в заголовочном файле мне нужно только объявить экземпляр класса. Получается, описывается пустой Class2, который в файле исходников уже читается как полноценный из подключённого заголовка, так?

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Не совсем :) Просто мы запоминаем в уме, что у нас где-то будет Class2 :) Типа заглушка "Это будет Class2".

На этапе линковки эта заглушка и сам класс связываются. ( Отсюда и название операции Linking - Связывание )

1
Автор поста оценил этот комментарий

Можно подробнее про forward declaration? Не очень понял, когда и где это можно и нужно использовать.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Forward declaration - это техника позволяющая сообщить компилятору о том, что в программе есть какой-то класс, структура или функция, не сообщая при этом о том где оно находится и как реализовано.
Для этого нужно просто описать их в одну строку как при обычном объявлении, но не давать реализации - поставить точку с запятой:
class Game;
или
struct Unit;
или
void MegaFunction( int a, float b );

После этого можно будет использовать указатели на такой класс, структуру, функцию. Помимо этого функцию можно будет вызывать. :)
Однако в программе действительно где-то должен быть реализован этот класс/структура/функция. Иначе возникнет ошибка линковки. :)

Нужен Forward Declaration в двух случаях:
- Для того, чтобы не подключать заголовочный файл в заголовочном файле (см. пост)
- Для того, чтобы решить ситуацию с перекрестным подключением заголовочных файлов друг в друга.

показать ответы
0
Автор поста оценил этот комментарий

Чем static_cast отличается от классического приведения?

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Он правильно приводит указатели и выдает ошибку компиляции при невозможности приведения типов.

1
Автор поста оценил этот комментарий

Вот ни разу не было проблем из-за присваивания вместо сравнения, всегда писал ==

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Ну эта ошибка часто встречается у новичков :) Поэтому и существует такой совет для них :)
1
Автор поста оценил этот комментарий

Можно ли надеяться на продолжение

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
1
Автор поста оценил этот комментарий
Ох, как! Поздравляю с успехами!)
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Спасибо! Стараемся! :)
А для тех, кто соскучился по моим урокам могу предложить для тренировки поиграться с нашим тестовым заданием на Junior C++:
https://deuteriumwars.com/career/cpp/DeuteriumTanksTest.pdf
Будет сложно, но думаю, что интересно :)

Иллюстрация к комментарию
1
Автор поста оценил этот комментарий
Ты даже ник сменил, чтобы замести следы?)
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Та не.. Тот ник - пережиток игрового прошлого :)
А тут как раз у нас новый виток в стартапе, новая должность, ребрендинг :)
Нужно быть солидным, скоро за мной будет стоять армия из C++ Junior'ов :))

Иллюстрация к комментарию
показать ответы
1
Автор поста оценил этот комментарий

Можно ли надеяться на продолжение

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Лично я - надеюсь :)
показать ответы
1
Автор поста оценил этот комментарий

@Tinaynox, привет.

Можно как-то с тобой связаться? Есть предложение.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Свяжись :) скайп и вк такие же :)
1
Автор поста оценил этот комментарий
а где про qt.config можно почитать подробно?

Ещё кто то высказывал предположение (или я так понял), что сам sqlite как плагин нужно подгружать в проект? это я правильно понял или не очень? ))

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

http://doc.qt.io/qt-5/qt-conf.html

Если кратко - создаешь файл qt.conf в папке где будет лежать экзешник, прописываешь там типа такого:

[Paths]

Plugins=plugins


Создаешь в том же каталоге папку plugins, внутри нее папку platforms и другие по требованию как у Qtей соответственно :) Заполняешь всё это нужными тебе dll-ками по своим местам и радуешься жизни ( "но это не точно" )

показать ответы
1
Автор поста оценил этот комментарий

@Dansken, @0xDEADFA11

Камрады, почему датабаза не загружается в деплойменте (Qt)?

Через Qt Creator пашет, в дебажном выпуске пашет, в релизном говорит:

"Driver not loaded Driver not loaded"


Пути поиска добавил:

QStringList paths = QCoreApplication::libraryPaths();

paths.append(".");

paths.append("imageformats");

paths.append("platforms");

paths.append("sqldrivers");

QCoreApplication::setLibraryPaths(paths);


В папку библиотеки положил:

MyProg\sqldrivers\qsqlite.dll


какие нужны ещё колдунства?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Непосредственно с qsqlite не работал, но в целом в рамках плясок с Qt модулями могу наугад посоветовать пошаманить в сторону qt.conf. Когда-то это мне помогло намного лучше чем QCoreApplication::setLibraryPaths.

показать ответы
1
Автор поста оценил этот комментарий

@Dansken,Здравствуйте,я учусь перешел в 10 класс и после школы хочу пойти учиться на программиста.Я знаю основы Паскаль,Решил выбрать с++ в качестве первого языка программирования,понемногу учу!Правильно ли я сделал,что выбрал именно его,а не что-то полегче?Посоветуйте пожалуйста список литературы,сайтов,что угодно,для изучения с++.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

С/C++ - отличная база для любого программиста ИМХО :) Начните с моих уроков ( ссылки в шапке поста "Начальный курс создания компьютерных игр на C/C++" ), а потом закрепите любым учебником по C++ :)

1
Автор поста оценил этот комментарий

Ну пока что не очень :)  просто хотелось бы узнать об этом побольше (именно на понятном языке, которым излагаете Вы) и как это можно применять на практике, даже на примере тех игр, которые описаны в курсе.

P.S. изучая курс у меня почему-то появляется слишком много вопросов, а ответы на них получить не всегда удается (гугл, конечно, всесилен, но...). Можно ли консультироваться непосредственно с Вами в комментариях или каком-либо другом месте?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Ну возможно сделаю как нибудь краткий экскурс по VCS :)

P.S. Конечно можно :) Как вам удобно - в комментариях( если там еще нет ответа ) или в скайпе( tinaynox ) или в ВК( tinaynox ) :)

1
Автор поста оценил этот комментарий

@Dansken, будет ли продолжение великолепного цикла постов "Курсы создания компьютерных игр на C/C++"?!
P.S. Спасибо за вдохновение и интересные вводные уроки!

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Будет, обязательно :)

показать ответы
1
Автор поста оценил этот комментарий

что значит в CPP? Конструктор ведь тоже - CPP, как и любая функция класса

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
"КлассНейм::" как бы намекает, что это делается вне методов и конструктора. Как правило - сразу перед конструктором :)
показать ответы
1
Автор поста оценил этот комментарий

@Dansken, @0xDEADFA11,

Комрады, товарищи друзья! Помогите со static полем в классе.

Суть такая: есть блок схема, в которой каждый блок - класс. Есть класс для группы блоков, в которых нужна статик-переменная, которая будет держать максимальный размер всех блоков этого класса. Т.е. в самом классе есть инструменты, которые увеличивают размер блока, и этот максимальный размер должен быть общим для всех.


но если в классе делать


public:

  void setBoxLenght(int);


private:

  static int boxLenght;


в конструкторе инициализация setBoxLenght(number);

и в функциях класса используется setBoxLenght(int), то при сборке выдаётся предупреждение ошибки unresolved external symbol "public: static int boxLenght

со ссылкой на OBJ файл. Чистка и qmake не помогают. Инициализация статической переменной вне класса выдаёт ошибку повторной инициализации в классе

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

В cpp файле произведи инициализацию статической переменной:
int КлассНейм::boxLength = 0;
И будет тебе счастье

показать ответы
1
Автор поста оценил этот комментарий

ориентировочные сроки имеются?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

ээм.. нет :| Скорее всего - в этом году :)

1
Автор поста оценил этот комментарий

@Dansken, будет ли продолжение великолепного цикла постов "Курсы создания компьютерных игр на C/C++"?!
P.S. Спасибо за вдохновение и интересные вводные уроки!

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
1
Автор поста оценил этот комментарий
Понятно, попробуем.

Спасибо!

PS^ ждем новых статей

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
1
Автор поста оценил этот комментарий
Понятно, попробуем.

Спасибо!

PS^ ждем новых статей

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Сам жду, но пока свободное время у меня имеет отрицательное значение ))

1
Автор поста оценил этот комментарий

Уважаемый @Dansken, а будет ли пост посвященный контролю версий? Я возможно что-то упустил ввиду своей невнимательности, но я не увидел в Ваших работах об этом ничего.  

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Не было, а что уже очень нужно? :)
показать ответы