Я ищу предложения проекта, которые вынудили бы меня "пачкать руки" с усовершенствованными функциями C++. Я говорю о проектах, которые использовали бы полную мощность языка (STL или даже повысили бы (очень еще не использовал его)).
Почему? Поскольку я хочу учиться, я хочу найти новые проблемы. На работе вещи начинают быть скучными, действительно. Я привык к постоянному обнаружению с новыми вещами, новыми идеями и функциями. Это - большую часть времени не случай кода компании прежней версии, как можно предположить. И тем не менее, смотря на некоторые вопросы и ответы здесь, которые копаются в глубинах шаблонов, совместно использованные указатели и так далее, я, оказывается, нахожу меня потерянным, не зная ответ или еще хуже - даже не понимающий, что продолжается.
Вот почему я ищу что-то, что я мог кодировать сам, с помощью предпочтительно только C++ (+ повышение, возможно) - утилита командной строки, никакая графика. И я действительно не хочу присоединяться к любому сообществу разработчиков ПО с открытым исходным кодом. Рассмотрение кода других полезно, я знаю. Но это - то, что я делаю на работе много так... нет, спасибо. Проект может быть чем-либо, значимым или бессмысленным, полезная утилита, или просто что-то составило, который не имеет никакого реального использования. Единственное требование, что оно вынудило бы меня действительно протестировать свои навыки C++. Или по крайней мере это должно быть очень трудно или даже невозможно кодировать с элементарными знаниями C++ - я - вид человека, который никогда не удовлетворен кодом, который просто работает, таким образом, я полагаю, что это вынудит меня учиться. Но примите во внимание, что я - рабочий, и мое время ограничено, так ответы как "код, Ваша собственная ОС" действительно не поможет многому.
Что мне нужно кодировать, чтобы погрузиться в глубины продвинутого C ++?
И, нет, я не шучу. Нисколько. Я начал изучать C ++ около 15 лет назад и до сих пор регулярно изучаю новые вещи.
Взгляните на The Definitive C ++ Book Guide and List и сделайте свой выбор.
Я бы порекомендовал Modern C ++ Design Андрея Александреску и C ++ Templates The Complete Guide Vandevoorde & Josuttis. Одних этих двух достаточно, чтобы один программист мог получать новые идеи на месяцы, если не годы. (Обратите внимание, что чтение их в таком порядке имеет то преимущество, что книга Андрея тоньше и заставляет вас захотеть прочитать вторую, просто чтобы полностью понять то, что он пишет. Чтение их в обратном порядке имеет то преимущество, что вы не будете так часто теряться. в книге Андрея. Как хотите.)
Вы упомянули о создании чего-то вроде "бесполезной утилиты". Скорее, я бы предложил подумать о приложении или утилите, которая была бы полезна лично вам, или, возможно, о замене приложения, которое вы уже используете, которое вы могли бы разработать в соответствии с вашими собственными требованиями, рабочими процессами, эстетикой и т.д. Выберите какую-то конкретную вещь, которой вы хотите научиться в этом проекте, например, умные указатели, boost, метапрограммирование шаблонов, регулярные выражения, многопоточность, работа в сети. Затем разработайте, как реализовать приложение, используя выбранную технологию. Везде, где нужно сделать что-то, что вы уже умеете делать, остановитесь и попробуйте придумать, как это сделать в новой идиоме. Например, попробуйте написать приложение, используя только умные указатели.
Опасность создания маленького глупого демонстрационного приложения, на мой взгляд, заключается в том, что у вас не будет стимула довести его до конца. Гораздо лучше иметь в голове цель - создать полезный для вас инструмент. Именно этим я сейчас и занимаюсь: У меня очень запутанный рабочий процесс импорта фотографий, их маркировки, переименования и редактирования, поэтому я решил написать приложение на C# и WPF, которое будет делать это за меня. Это дает мне стимул довести проект до конца".
Заставлять себя решать знакомые проблемы, используя незнакомые методы, - отличный инструмент обучения.
Что-то вроде математической библиотеки матриц может соответствовать тому, что вы ищете. Множество потенциальных применений алгоритмов и контейнеров. Все это было сделано заранее, но если вы ищете что-то быстрое и грязное, чтобы попробовать свои силы, я бы пошел на это.
Напишите разветвленный или многопоточный веб-сервер. Напишите шепелявку. Создайте базу данных (полная реализация, SQL по желанию).
Выберите любую продвинутую структуру данных (например, дерево, очередь приоритетов и т.д.) и реализуйте ее.
Таким образом, вы научитесь:
- Проектировать в стиле ООП
- Предоставлять полезный и последовательный API
- Правильно использовать наследование, шаблоны, встроенные функции для достижения целей реализации
- Писать кроссплатформенный код
-
Используйте код STL как образец того, как все должно быть сделано.
Что мне нужно кодировать, чтобы проникнуть в глубины продвинутого C ++?
C ++ не имеет реальной продвинутой характеристики, язык сделан хорошо, продвинутые характеристики используют множество библиотек, существующих по всему миру.
из математических библиотек, графики, коммуникаций, windows / x-windows / kde / gnome и т. Д.
если вы хотите изучить зрелую коммуникационную библиотеку, я предлагаю использовать ADAPTIVE Communication Environment (ACE (TM)) , которая немного старомодна, но имеет действительно хороший набор продвинутых концепций языка.
Имеют высокую кривую обучения, но им пользуются все мэры компаний по всему миру.
С другой стороны, отказ от использования графических утилит является мазохистским, потому что вы теряете время на вещи, которые решает любой графический интерфейс.
Вы можете использовать Netbeans или Eclipse в качестве мультиплатформенных, KDE Developer для Linux (с KDE), MS Visual Studio в Windows и т. Д.
Инструмент профилировщика C++ заставит вас заглянуть в глубины языка.
Достаточно объективный ответ: я всегда думал, что самая сильная сторона объектно-ориентированной разработки - это полиморфизм. И его использование лучше всего наблюдать при работе с шаблонами проектирования.
Итак, я рекомендую получить библию Design Pattern от GoF и написать код, который ее использует. Приложение? Может быть любым, как указывалось ранее, потому что ничто не заставляет вас использовать какие-либо расширенные функции чего-либо вообще.
( нужны доказательства? Некоторые из самых сложных систем в мире написаны на COBOL людьми с нулевым теоретическим знанием CS )
Я выполнил все упражнения в книге Строуструпа "Язык программирования C++: Special Edition в течение примерно 6 месяцев. Это того стоило.
Попробуйте написать причудливый пул памяти. Наверняка ваши руки очень скоро испачкаются. Если этого будет недостаточно, добавьте возможность сборки мусора ;)
Проект может быть любым, значимый или бессмысленный, полезный утилита или что-то придуманное не имеет реального использования.
Намного лучше сделать что-нибудь полезное. Вы можете использовать его (и в какой-то степени это сделает вас более счастливым, если вы используете собственное приложение), и вы можете поделиться им (проект с открытым исходным кодом - или нет).
Единственное требование - чтобы он заставляют меня действительно проверить свои навыки C ++.
Хорошо, вот несколько идей, пришедших мне в голову:
Написать синтаксический анализатор для чего-нибудь (выражения, простой язык, XML, логические выражения?). Еще лучше напишите синтаксический анализатор / интерпретатор для языка, подобного прологу (вы определяете предикаты, объекты и отношения), а затем заставьте приложение выполнять логический вывод по заданным правилам для получения результата).
Напишите пакет регулярных выражений или отладчик регулярных выражений (что-то, где вы задаете строку и шаблон, и он сообщает вам, до какой точки в шаблоне соответствует строка). При написании сложного регулярного выражения такое приложение было бы очень полезно.
Напишите пакет XML для включения в повышение (эй, вы хотели что-то, что заставит вас действительно проверить свои навыки).
Напишите модуль значений нечеткой логики с полностью поддерживаемыми логическими операциями (скажем, с пятью значениями истинности: ложь, возможно, ложь, неизвестно, вероятно, истина, истина).
Напишите пакет AI, позволяющий легко разрабатывать и реализовывать различные нейронные сети с настраиваемыми функциями обучения / обратной связи.
Или, по крайней мере, должно быть очень сложно или даже невозможно закодировать с базовыми знаниями C ++
Только с базовыми знаниями C вы можете писать графические платформы, операционные системы и системы управления базами данных, математические и криптографические пакеты и так далее (практически все). Нет ничего , что невозможно было бы закодировать с базовыми знаниями C ++ ).
Ваше воображение действительно ваше предел.