233

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

Серия Курсы создания компьютерных игр на C++

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

// Начальный курс создания компьютерных игр на 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++

69 постов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
Автор поста оценил этот комментарий
Не было, а что уже очень нужно? :)
показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества