@BearPro
Защитник прав интеллектуальных меньшинств

Есть ли в природе актуальная литература по C++?

Пишу на Python, успешно.
Захотел изучить C++. Опыт работы с C-подобными языками заключается в тыкании Unity в течении одного вечера.
Чувак дал книжку, которая называется "C++ для чайников". Это конечно не совсем то, что мне нужно, но я надеялся хотя бы начать понимать синтаксис языка балагодаря ей.
Разумеется, книга на половину состоит из объяснений типа "что такое переменная", "что такое функция", и "что такое ООП" - всего того что мне не нужно.
Но проблема даже не в этом. Первый же пример в книге:
#include <cstdio>      // тут больше инклудов, чем в том примере, но это вроде как не должно
#include <cstdlib>     // быть ошибкой
#include <iostream>
#include "stdafx.h"
using namespace std;

int main()
{
    cout << "Hello world\n";
    return 0;
}

Приводит к ошибке " 'cout': undeclared identifier "
Дело в том, что я пользуюсь Visual Studio (Python в Visual Studio, ага), и компилятор C++ у меня, за компанию, актуален, в отличии от используемых для примеров во всех нагугленных мной книгах.
Короче, я ничего не понимаю в C++, но понимаю в программировании, и мне нужна литература по C++, актуальная для стандартного компилятора C++ в Visual Studio Community 2015.
Есть такое?
  • Вопрос задан
  • 176 просмотров
Решения вопроса 1
maaGames
@maaGames
Погроммирую программы
1. stdafx.h должен быть первой строчкой в cpp файле
2. Лучше избегать одновременного использования С и С++ ввода/вывода. Т.е. либо iostream, либо stdio. Иначе могут быть проблемы с синхронизацией ввода/вывода.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Free_ze
Пишу комментарии в комментарии, а не в ответы
#include "stdafx.h"вроде должен быть первым в файле.
В студии вам пока лучше создавать пустой проект, чтобы подобные штуки не мешали.

c8ea5745f7ad47b481e100046e1e27b2.png

Учитывая, что C++ поддерживает обратную совместимость, то любая, более или менее современная книжка (начиная с C++03, т.е. 2003 года) для вас будет актуальна. Да и вообще, стоило бы поискать K&R и овладевать Си.
Ответ написан
TrueBers
@TrueBers
Гуглю за еду
Во-первых, код, который вы привели, полностью валиден и должен собираться любым компилятором (если не считать stdafx). Если он выбрасывает ошибку, значит вы что-то натыкали лишнего в вижуал студии.

Во-вторых, нет таких книг "под компилятор". Есть различные стандарты. Из современных сейчас практически полностью реализован во многих популярных компиляторах -- С++14. С++11 реализован на 99.99% обычно.
Сначала нужно решить, какой стандарт начать изучать -- 03 или 11/14. Т. к. 14-й -- это, по сути, минорный апдейт 11-го.

Чистый С++14 без всяких там костылей и экстеншенов лучше изучать на компиляторе clang с максимальными флагами ворнингов, педантиков и т. д. Это научит отличать стандартизованный С++ от миллионов расширений и костылей, которые в него успели внести за время его развития. Да и сообщения об ошибках у клэнга на порядок адекватнее, чем наркоманские простыни неверного инстанцирования шаблонов вижуал студии.

Если работаете под виндой, советую поставить Cygwin и на него clang и, если позволяет религия, vim. Можно clion, для новичка он неплохо поможет. Лучше сразу задать параметр -std=c++14, чтоб компилировать под 14-й стандарт. Чтобы отключить всевозможные расширения и не пропускать ни одного предупреждения, нужно добавить параметры -Weverything -Werror -pedantic-errors -Wno-c++98-compat.

Ещё, советую не использовать хидеры, начинающиеся на c*, т. к. они оставлены для совместимости с чистым языком Си. Ибо, используя их, будете путать и не различать чистый Си и C++. Лучше использовать чистый STL и пространство имён std, там всё необходимое есть для начала.

Референсы и хидеры для всяких фич лучше смотреть на C++ reference, ибо там всё по стандарту расписано более-менее.

ПС Ещё, существует два холиварных направления в C++: чистый STL, который предлагает Страуструп и Ко. Там, в основном, используются "3 кита языка: контейнеры, алгоритмы и итераторы". Это типа "тру C++", который изначально придумывался. В основном сюда хорошо накладываются паттерны GoF.
Второе направление -- "Си с классами", это когда, по сути, из ООП используется только полиморфизм, да и то, не там, где нужно. Здесь обычно мешают всё подряд: и Си, и С++, и STL, и макросы, и ещё чёрт знает что. Его использует большинство тех, кто перешёл из Си в С++. Много книг так же написано в данном стиле.
Лично я рекомендовал бы на случай ООП разработки всё-таки приучать себя использовать "тру C++", ибо там есть всё, что нужно, для нормального ООП. Ну, а если хочется просто учить прикладной язык и не париться насчёт хорошего кода, то можно учить как угодно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы