Изучает C ++ через Qt Framework. Действительно изучает C ++ [закрыто]

32

Проблема, с которой я столкнулся, заключается в том, что большинство книг по С ++, которые я читаю, почти всегда тратят на синтаксис и основы языка, например, forциклы while, массивы, списки, указатели и т. Д.

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

Затем я наткнулся на QT, которая является удивительной библиотекой!

Но, работая с демоверсиями, похоже, что я сейчас нахожусь в обратной дилемме. Я чувствую себя сыном богача, который ездит на спортивной машине, субсидируемой отцом. Как будто я мог бы создавать фантастические программы, но понятия не имею, что происходит под капотом.

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

Я не жалуюсь на это. Мне просто интересно, как заполнить пробел в знаниях между базовой структурой языка и интерфейсом высокого уровня, который обеспечивает инфраструктура Qt?

user866190
источник
Я не знаком с программированием в Qt. Вводит ли он какой-либо новый синтаксис или меняет язык, или это просто очень сложные библиотеки?
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner Это не QT - это GUI Framework qt.nokia.com, если вам интересно
Карлсон
Qt также предлагает альтернативу стандартным классам и контейнерам (например, QString, QList и т. Д.) И многим другим средствам. Некоторые из них я считаю даже более интуитивно понятными, чем стандартные. Я думаю, что это хорошая среда программирования, но я бы посоветовал изучать основной язык C ++ отдельно.
Джорджио
3
Если вы хотите узнать, как реализован Qt, просто скачайте и посмотрите его исходный код.
user16764
1
@Karlson Qt добавляет некоторые вещи к языку, поэтому необходим компилятор метаобъектов moc aka. Это добавляет некоторое отражение и составляет основу системы сигналов / слотов Qt.
Тамас Селеи

Ответы:

11

Вы хотите знать, как нажатие на акселератор заставляет автомобиль двигаться быстрее, или вас интересует только то, что нажатие на акселератор заставляет автомобиль двигаться быстрее?

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

Есть работы, которые хороши в каждом стиле, так что вам решать, что вы хотите запрограммировать. IMO, вы бы оказали себе медвежью услугу, хотя, если бы вы не приложили усилий, чтобы отодвинуть часть абстракции, которую QT дает вам в конце концов.

Ryathal
источник
2
«IMO, вы бы оказали себе медвежью услугу, хотя, если бы вы не приложили усилий, чтобы отодвинуть часть абстракции, которую QT дает вам в конце концов». Ваше право и вот это у меня такое чувство
user866190
18

Наибольший ущерб, который вы нанесете себе, если вы хотите выразиться таким образом, заключается в том, что вы вообще не научитесь использовать стандартные структуры данных C ++, итераторы, алгоритмы и строки. Qt имеет собственные библиотеки для всех этих целей, и вы почти вынуждены использовать их вместо стандартных объектов C ++, потому что API Qt принимают только свои собственные структуры данных.

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

эфирное масло
источник
3
Согласен - Qt использует совершенно другой набор инструментов, чем стандартный C ++.
DeadMG
В нашей компании велись долгие споры о том, следует ли использовать стандартные контейнеры и итераторы или Qt, и мы еще не нашли решение: мы в конечном итоге использовали оба, хотя мы не смешиваем два стиля в данный модуль. У меня такое ощущение, что переход с Qt на стандартную концептуально очень прост, хотя это займет некоторое время.
Джорджио
9
Я использую стандартные контейнеры и алгоритмы в своих инженерных моделях - то есть в моей бизнес-логике. Я использую контейнеры Qt внутри моего кода GUI. Таким образом, мои инженерные модели защищены от изменений в Qt и наоборот. У Qt есть способы соединения стандартных контейнеров и их контейнеров.
emsr
2
В любом случае, меня не волнуют контейнеры. Они не самая полезная часть STL; алгоритмы гораздо важнее. Благодаря конструкции STL его алгоритмы могут легко работать с другими контейнерами, а контейнеры Qt предназначены для работы с алгоритмами STL. Беспроигрышный, правда.
MSalters
12

Учитывая, что Qt имеет свой собственный мета-компилятор, с которым вам нужно обрабатывать исходные файлы, трудно считать код Qt «просто C ++».

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

На самом деле, это попытка сделать C ++ максимально похожим на Java. Он пропускает или обескураживает все удивительные вещи, которые на самом деле делают C ++ достойным использования сегодня . Вместо этого вы попадаете в подмножество, которое больше всего похоже на низшую Java.

Поэтому, если цель состоит в том, чтобы изучить C ++, я бы сказал, нет, держитесь подальше от Qt. Возможно, посмотрите вместо этого на Boost, если вы хотите использовать установленную библиотеку в качестве отправной точки. Повышение воплощает практики, которые сегодня считаются хорошими .

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

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

C ++ как язык не имеет встроенного класса WebBrowser. Если вы читаете стандарт C ++, он ничего не говорит о браузерах. Он даже не упоминает приложения с графическим интерфейсом.

Это потому, что эти вещи построены сверху, предоставлены такими библиотеками , как Qt. C ++, как и любой язык программирования, посвящен логике, тому, как выразить эту логику. И да, это означает, что нужно работать с массивами, указателями, циклами и всем этим.

Сможете ли вы написать веб-браузер, используя только эти встроенные инструменты, если у вас будет достаточно времени ? Знаете ли вы, как выразить логику программы? Если нет, то вам нужно тратить больше времени на циклы и указатели, и меньше звонить new QWebKit()и просто совмещать готовые библиотеки.

«Философия и мощь языка» заключаются в массивах, списках и циклах, а не в веб-браузерах.

jalf
источник
4
Я никогда не говорил, что они лучше, потому что они новы . Они новые и они лучше. Дело в том, что C ++ как язык просто не очень подходит для такого Java-подобного подхода. В C ++ наследование и полиморфизм во время выполнения - это боль, потому что он практически требует от вас размещения в куче объектов повсеместно, что и придало языку репутацию утечки памяти, потому что он склонен к нарезке ошибок, потому что это затрудняет копирование объектов. Это также неэффективно, менее расширяемо и требует более утомительного стандартного кода.
Джалф
2
Черт, Qt нужен собственный мета-компилятор, чтобы сделать их стиль программирования более приемлемым . Разве это тебе не говорит?
Джалф
4
Я не защищал Qt сам по себе (я сам вижу много ограничений в этом). Ваше утверждение «стиль C ++, который использует и поощряет Qt, - это то, что для остальных из нас в последний раз видели примерно в 1995 году». С этой формулировкой не ясно, что плохо с этим стилем (кроме того, что ему 15 лет) и каковы текущие, лучшие альтернативы. Может быть, если вы будете более конкретны, то, что вы имеете в виду, станет яснее.
Джорджио
3
@JimInTexas: это также предшествует C ++. Ваша точка зрения? В начале середины 90-х C ++ был совсем другим зверем. Это было намного ближе к тому, что в итоге стало Java, чем сегодня.
Джалф
3
@JimInTexas: Да, это неправильно, но, надеюсь, должно быть достаточно ясно, что я имею в виду. Это попытка достичь целей разработки Java на C ++. Это попытка реализовать ту же некорректную модель ООП, которую реализует Java.
Джалф
9

Изучает C ++ через Qt Framework. Действительно изучает C ++

Может быть.

Мне нужно увидеть код, который вы добавляете в обработчики событий.

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

Брайан
источник
5

Не беспокойся; сначала большая часть вашего кода будет использовать только фреймворк, но через некоторое время вам придется его расширять , хотя бы чуть-чуть. Тогда вам придется использовать все больше и больше C ++.

Также помните, что у вас есть весь доступный источник Qt, IDE с радостью предоставит вам определение любой функции / метода / класса, которое вы хотите. Чем глубже вы идете, тем больше C ++ вы увидите.

Другие упоминали о разнице между Qt C ++ и стандартным C ++. Эти попадают в два лагеря:

  • другая библиотека: Qt включает в себя все обычные контейнеры: массивы, списки, наборы, хеш-карты и т. д. Они очень хорошо сочетаются друг с другом и являются хорошей реализацией, но они не являются разновидностью STD. Тем не менее, в последних версиях (4.1 и более поздних, я думаю) они имеют «STD-подобные» API в дополнение к старому варианту (и Java-подобный API). В конце концов, выбор дизайна (когда использовать массив, когда использовать хэш-карту) одинаков, поэтому переход на STD для не-Qt проектов не такой сложный.

  • mocдополнения синтаксиса: в основном для обработки сигналов, но также пара более приятных конструкций цикла. Многие люди считают, что этот инструмент означает, что он больше не C ++; но имхо они чувствуют себя как чуть более умные макросы. Хорошая слабосвязанная обработка сигналов является огромным преимуществом хорошей структуры, и ее общеизвестно сложно сделать на языке статической типизации. В современном C ++ это выполнимо с большой дозой шаблонов; но это было далеко от стандарта, когда Qt впервые получил moc. В конце, если вы позже захотите делать не-Qt проекты, сначала проверьте, будете ли вы использовать какую-либо инфраструктуру и есть ли у нее сигналы. Если да, то большинство из того, что вы привыкли делать с Qt, будут применимы, так что не нужно «вредить» при изучении Qt.

Хавьер
источник
Какие улучшения цикла даются moc?
Василий Старынкевич
@Basile Starynkevitch: Возможно, он ссылается на цикл foreach (который я активно использую). Это дополнение к синтаксису, но, ASAIK, это не имеет ничего общего с moc. Таким образом, вы правы, что, возможно, ответ должен быть сформулирован по-другому.
Джорджио
foreachэто просто макрос .... (на самом деле "псевдоним", Q_FOREACHопределенный в <Qt/qglobal.h>). Я не думаю, что mocэто обрабатывает. И C ++ 11 имеет for (auto it : container)конструкцию!
Василий Старынкевич
@Basile Starynkevitch: Вероятно, Qt потребуется глубокая реинжиниринг, если он должен будет перейти на C ++ 11: Qt был разработан для C ++ (и также пытался преодолеть некоторые из его ограничений), поэтому некоторые из его решений не нужны с C ++ 11.
Джорджио
1
Я использую как Qt, так и Boost. Между этими двумя библиотеками много общего, но Qt гораздо легче выучить.
Джим в Техасе
4

Qt широко используется в коммерческом мире, поскольку предоставляет полный кроссплатформенный набор инструментов и среду разработки, включая хорошую библиотеку графического интерфейса.

Он также полностью поддерживает интернационализацию, в том числе отличный инструмент «Лингвист».

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

И да, Qt - это C ++, и вы можете смешивать стандартные и добавлять библиотеки к своему сердцу, если это заставляет вас чувствовать себя лучше.

Джим в Техасе
источник
3

Это плохая идея изучать C ++ через Qt. Сначала вы должны изучить языковые концепции, не зависящие от какой-либо среды, и это то, чему вас научат книги на c ++, и они правы. По сути, «for и циклы while, массивы, списки, указатели» - вот что такое языки программирования. Дополнительные функции обеспечиваются фреймворками. Как только вы изучите язык программирования, вы сможете изучить любую инфраструктуру, такую ​​как Qt или MFC, которая построена с использованием языка, что позволяет быстро разрабатывать приложения. Что касается Qt, то, как только вы изучите c ++, это отличная среда, которая делает вас столь же продуктивным, как и любые разработчики на Java или .Net. Вскоре вы сможете разрабатывать приложения для iOS и Android, используя Qt.

Яак
источник
2

Что ж, я думаю, что лучший способ изучить C ++ - это использовать ТОЛЬКО собственный синтаксис (стандартный C ++), поэтому вы сможете использовать материал ЯЗЫКА, а НЕ Qt (или любые другие фреймворки, библиотеки ... и т. Д.).

Зачем? потому что, как новичок, когда вы посмотрите на любой код C ++, смешанный с другим кодом не-C ++ (в данном случае Qt), вы не сможете увидеть, что такое C ++, а что нет, скорее это будет более сложный процесс.

CVist
источник