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


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

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

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

По поводу приведения типов, возьму на себя смелость посоветовать изучить C++ стиль явного приведения. Есть замечательные средства для обычного приведения

static_cast <type> (var);

Так же есть "семантическая кувалда" с которой надо быть осторожным, но порой она выручает, я говорю о reinterpret_cast.

При проектировании иерархии классов (да и вообще) может понадобится const_cast, для снятия константности объекта.

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

А можно немного подробнее про const_cast? Просто мне всегда казалось, что если компилятор говорит, что не может преобразовать <const что-то там> в <просто что-то там>, то это означает, что быдлокодер в моём лице забыл дописать к какому-то методу const. Я, конечно, предполагаю, что он не просто так появился в языке, но реально не могу сходу вспомнить ни одного случая, когда бы он мне понадобился.

раскрыть ветку (1)
4
Автор поста оценил этот комментарий
Скорее наоборот дописал const там, где это не нужно. ССЗБ может быть автором какой-то библиоткети, исходников которой у вас нет, но подправить нужно. Допустим, вам нужно "подружить" две библиотеки, одна из которых следует const correctness, а другая - нет.


Но в своем коде const_cast лучше избегать и использовать mutable.

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

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

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

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

Потому что ты ленивая задница. Но недостаточно ленивая.

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

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

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

Я с детства любил компы и все что с ними связано, любил железо, любил работать с разным ПО, потом вот захотелось делать что-то свое. Теперь вот учусь кодить, потому что нравится кодить)

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

Учиться надо на интересных тебе проектах: игру напиши, напиши месенджер простенький и раздай его своим друзьям. Это кажется весьма трудным когда у тебя нет знаний, и по началу будет очень трудно. Но за 2-3 недели обучения по небольшим статьям или видеоурокам ты многому научишься. Лично я учился примерно так:
1. Нужно сделать %name% но я не представляю как это сделать.
2. Гугл ---> Как сделать %name% на %lang_name%

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

Много зависит от выбранного тобою языка. C++ - не лучший выбор для первого языка. Плюсы очень мощный язык, но функционал "из коробки" у него небольшой, приходится осваивать еще библиотеки для работы с графикой\музыкой\сетью\ещечем. К тому же C++ запутанный и опасный своими указателями, и да, можно, и нужно использовать умные указатели, но пред этим надо преодолеть сырые указатели.
Из компилируемых языков посоветую Java или C#, лично мне C# больше нравится.

Из интерпретируемых языков - Python. Python one love

p.s. обучение по видео урокам приемлемо только в самом начале.

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

приходится осваивать еще библиотеки для работы с графикой\музыкой\сетью\ещечем

Какая разница в обучении между стандартной библиотекой и некоторой внешней?)

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

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

Так что разница существенная. как по мне.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Вы сгущаете краски до самого злого уровня) Для популярных библиотек обычно нет таких проблем. Зато как в джаве, так и в сишарпе попадались такие отвратные реализации кое-чего, что испольование сторонних библиотек становилось стандартом-дефакто.


Про стандарт и стиль - это уже настолько субъективно, что это оставлю на вашей совести)

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

Да, протоколы SMTP, pop3, ssl, ftp и прочие

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

Ладно, буду дальше никогда не отчаиваться и верить в свои силы, как ты, сниперс!

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

У меня тоже проблема с вниманием была, когда я книгу читал. Ну прочел главу, сделал задание в конце, перешел к следующей главе. Но через некоторое время это наскучивает.

Но все меняется, когда ты что-то делаешь. Когда ты сделал что-то, и оно работает и ты такой "оно ЖИВОЕ!! Муха-ха-ха! Ай да this->getName(), ай да сукин сын!!".

А когда ты находишь кусочек полезного знания, он превращается из отдаленного интересного факта в Ту самую невероятно полезную штуку, которой тебе так не хватало в куче мест. Это как с полезной информацией об играх (рецепы из кубача, горячие клавиши, древо технологий в стратегиях) - нужны - запоминаются.


Словом, пили какие-нибудь интересные штуки. Не отказывайся совсем от чтения книг и статей, но и не просто читай. Когда просто читаешь (особенно не делая мелких упражнений, вроде тех, что приводят иногда в конце глав) - это не только может стать скучно, но еще и не особо оседает в голове.

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

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

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

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

раскрыть ветку (8)
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

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

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

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

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

Есть объективные преимущества. Можно продолжать по-старому, это не goto, но лучше знать и не пользоватся, чем не знать вовсе)

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

char c = 10;

int *p = (int*)&c;

*p = 5; //ошибка во время исполнения

int *q = static_cast<int*>(&c); //ошибка во время компиляции

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

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

А еще есть плюс в виде навигации по коду)

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

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

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

Примерно тем же, чем и С++  от С

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества

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

Теги

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

Сообщества