正在通过Qt框架真正学习C ++来学习C ++ [关闭]


32

我的问题是,我阅读的大多数C ++书籍都几乎永远花在语法和语言基础上,例如for循环while,数组,列表,指针等。

但是他们似乎从来没有建立过足够简单的东西用于学习,却又足够实际的东西来使您理解语言的哲学和力量。

然后我偶然发现了QT,这是一个了不起的库!

但是通过他们的演示进行工作,似乎我现在正处于相反的困境。我感觉像是有钱人的儿子在父亲补贴的跑车中开着车。就像我可以构建出色的软件一样,却不知道幕后到底发生了什么。

作为我的两难选择的一个例子,是构建一个简单的Web浏览器。在纯C ++中,我什至不知道从哪里开始,但是使用Qt库,可以在几行代码中完成。

我没有为此抱怨。我只是想知道如何填补语言的基本结构和Qt框架提供的高级接口之间的知识空白?


我对Qt中的编程不熟悉。它实际上引入了任何新的语法或更改了语言,还是仅仅是一些非常复杂的库?
FrustratedWithFormsDesigner 2012年

@FrustratedWithFormsDesigner它不QT是GUI框架qt.nokia.com如果你有兴趣
卡尔森

Qt还为标准类和容器(例如QString,QList等)和许多其他功能提供了替代方法。我发现其中一些比标准的更加直观。我认为这是一个不错的编程环境,但是我建议您单独学习核心C ++语言。
乔治

3
如果您想了解Qt的实现方式,只需下载并查看其源代码即可。
user16764 2012年

1
@Karlson Qt确实向语言添加了一些内容,因此需要moc aka元对象编译器。这增加了一些反射,并构成了Qt信号/插槽系统的基础。
陶Szelei

Answers:


11

您是否想知道踩加速器如何使汽车行驶得更快,还是只关心踩加速器使汽车行驶得更快?

您会看到黑盒编程的好处,这是在所有盒子都工作时设计系统的好方法。但是,必须有人制作黑匣子,如果您想成为那个男孩/女孩,那么您需要比使用该盒子的男孩更多地了解语言。

有些工作是每种风格的好工作,因此您要编程的内容取决于您。IMO会给您带来很大的伤害,但是如果您不付出努力来剥离QT最终给您的某些抽象。


2
“ IMO,如果您不花力气削减QT最终给您的某些抽象,那您将是一个自残的人。” 您的权利就是我的直觉
user866190 2012年

18

如果要这样说,对您自己造成的最大损害是,您将根本不会学习使用标准的C ++数据结构,迭代器,算法和字符串。Qt具有用于所有这些目的的自己的库,由于Qt API仅接受其自己的数据结构,因此几乎所有人都不得不使用它们而不是标准C ++实体。

有人可能会争辩说,掌握其他算法后再学习使用一种算法库是一件微不足道的任务。在进行面试官要求您精通C ++的面试之前,请确保您事先处理这些琐碎的事。


3
同意-Qt使用与标准C ++完全不同的工具集。
DeadMG

在我们公司中,存在一个长期的争论,是应该使用标准容器和迭代器还是使用Qt容器,我们还没有提出解决方案:即使没有将两种样式混合使用,我们最终还是使用了两者。给定的模块。我觉得从Qt过渡到标准在概念上非常容易,即使需要一些时间。
Giorgio 2012年

9
我在工程模型中使用标准的容器和算法-即我的业务逻辑。我在GUI代码中使用Qt容器。这样,可以保护我的工程模型免受Qt更改的影响,反之亦然。Qt具有连接标准容器及其容器的方法。
emsr 2012年

2
无论如何,我并不在乎容器。它们不是STL中最有用的部分。算法更为重要。由于STL的设计,其算法可以轻松地与其他容器一起使用,而Qt容器被设计为与STL算法一起使用。确实是双赢的。
MSalters 2012年

12

考虑到Qt必须使用自己的元编译器来处理源文件,因此很难将Qt代码视为“仅仅是C ++”。

但是更重要的是,Qt使用和鼓励的C ++ 风格对我们其他人来说是在1995年左右才看到的。

确实,这是一种尝试,使C ++尽可能像Java。它错过了或不鼓励使C ++值得今天使用的所有令人惊奇的事情。取而代之的是,您被束缚在一个感觉像是劣等Java的子集中。

因此,如果目标是学习C ++,我会说不,请远离Qt。如果您想使用已建立的库作为起点,则可以看看Boost。Boost体现了当今公认的良好做法。

但老实说,如果您想学习C ++语言,请选择一本好教科书,并专注于该语言

编写Web浏览器,无论您如何操作,都充其量可以教您有关Web浏览器的知识。它不会告诉您很多有关您所使用的语言的信息。

C ++作为一种语言没有内置的WebBrowser类。如果您阅读C ++标准,则它对浏览器没有任何帮助。它甚至没有提到GUI应用程序。

这是因为这些东西是建立在顶部,由图书馆提供的,如 Qt的。像任何编程语言一样,C ++也与逻辑有关,与如何表达该逻辑有关。是的,这意味着要使用数组,指针和循环以及所有这些东西。

如果有足够的时间,您是否能够仅使用那些内置工具来编写Web浏览器?您知道如何表达所涉及的程序逻辑吗?如果没有,那么您需要花费更多的时间在循环和指针上,减少调用,new QWebKit()而只是背负现成的库。

“语言的哲学和力量”以数组,列表和循环的形式出现,而不是在Web浏览器中。


4
我从来没有说过因为它们是新的而更好。它们是新的,而且更好。关键是,C ++作为一种语言不太适合这种类似于Java的方法。在C ++中,继承和运行时多态性很痛苦,因为它实际上需要您在各处进行对象的堆分配,这首先使该语言在内存泄漏方面享有盛誉,因为它易于切片错误,因为它使复制对象变得更加困难。它效率低下,扩展性差,并且需要更繁琐的样板代码。
2012年

2
哎呀,Qt需要自己的元编译器只是为了使其编程风格可以接受。那不是告诉你什么吗?
2012年

4
我本身并没有为Qt辩护(我自己发现Qt有很多限制)。您的陈述“ Qt使用和鼓励的C ++风格,对我们其他人而言,是在1995年左右才看到的。” 通过这种表述,尚不清楚这种风格有什么坏处(除了已有15年的历史),以及目前更好的替代方法是什么。也许如果您更具体,您的意思会变得更清楚。
乔治

3
@JimInTexas:它也早于C ++。你的意思是?在90年代中期,C ++是完全不同的野兽。它比今天更接近最终成为Java的东西。
2012年

3
@JimInTexas:是的,这是错误的,但是希望它也应该很清楚我的意思。这是尝试以C ++实现Java的设计目标。这是一种尝试实现与Java实现相同的有缺陷的 OOP模型的尝试。
2012年

9

正在通过Qt框架学习C ++真正在学习C ++

也许。

我必须看到您在事件处理程序中放入的代码。

确实,不要着迷于您“知道”多少。我们都使用窗口框架,并且我们还在学习。只需继续编码/阅读新事物,您将继续学习C ++。学习新的窗口框架是对您的技能的重要补充,即使这可能并不意味着您可以使用C ++实现神经网络或快速排序。


5

不用担心 起初,您的大多数代码将只使用该框架,但是过一会儿,您将不得不扩展它,即使只是一点点。然后,您将不得不使用越来越多的C ++。

还要记住,您拥有完整的Qt来源,IDE会很乐意带您定义所需的任何函数/方法/类。您越深入,就会看到更多的C ++。

其他人提到了Qt C ++和标准C ++之间的区别。它们分为两个阵营:

  • 不同的库:Qt包括所有常用的容器:数组,列表,集合,哈希图等。它们很好地结合在一起并且是很好的实现,但它们不是STD类型。不过,在最新版本(我认为是4.1和更高版本)中,除了旧版本(以及Java类API)外,它们还具有“ STD类” API。最后,设计选择(何时使用数组,何时使用哈希图)是相同的,因此对于非Qt项目更改为STD并不难。

  • moc语法增加:主要用于信号处理,但也有一些更好的循环构造。许多人认为此工具意味着它不再是C ++。但是恕我直言,他们感觉就像是更聪明的宏。良好的松耦合信号处理是良好框架的巨大优势,并且众所周知,使用静态类型语言很难做到这一点。在现代C ++中,它可以使用大量模板来实现。但这与Qt刚开始时的标准相差甚远moc。最后,如果您以后要执行非Qt项目,请首先检查您是否将使用任何框架以及它是否具有信号。如果是的话,那么您通常会使用Qt进行的大多数操作都将适用,因此首先学习Qt不会有“害处”。


给出了哪些循环改进moc
Basile Starynkevitch 2012年

@Basile Starynkevitch:也许他指的是foreach循环(我经常使用)。这是一种语法添加,但是,ASAIK与moc没有任何关系。所以您说对了,也许答案应该以不同的方式提出。
乔治

foreach只是一个宏...。(实际上是Q_FOREACH定义的“别名” <Qt/qglobal.h>)。我不认为这moc正在处理中。C ++ 11具有for (auto it : container)构造!
Basile Starynkevitch 2012年

@Basile Starynkevitch:如果Qt必须转向C ++ 11,可能需要对Qt进行深入的重新设计:Qt是为C ++设计的(并且还试图克服其某些局限性),因此C不需要某些解决方案++ 11。
乔治

1
我同时使用Qt和Boost。这两个库之间有很多重叠,但是Qt易于学习。
吉姆在德克萨斯州2012年

4

Qt被广泛用于商业领域,因为它提供了完整的跨平台工具集和开发环境,其中包括良好的GUI库。

它还完全支持国际化,包括出色的“语言学家”工具。

如果您计划学习,那我就不用Qt了。另一方面,如果您喜欢C ++并且想学习适销对路的技能,那么Qt是值得学习的。

是的,Qt是C ++,如果可以使您感觉更好,则可以混入标准并将库提升到您的心脏内容。


3

通过Qt学习C ++是一个坏主意。首先,您必须学习独立于任何框架的语言概念,这就是C ++书籍将教给您的知识,它们是正确的。基本上,“ for和循环while,数组,列表,指针”是编程语言的全部内容。框架提供了其他功能。一旦学习了编程语言,就可以学习使用该语言构建的任何框架(例如Qt或MFC),从而可以快速开发应用程序。关于Qt,一旦您学习了c ++,它就是一个出色的框架,它使您像任何Java或.Net开发人员一样高效。不久,您将能够使用Qt开发ios和Android应用程序。


2

好吧,我认为学习C ++的最好方法是仅使用其自身的语法(标准C ++),因此您将能够使用LANGUAGE内容,而不是Qt(或任何其他框架,库...等)。

为什么?因为作为一个初学者,当您将任何C ++代码与其他Non-C ++代码(在本例中为Qt)混合使用时,您将无法看到C ++的内容,什么不是C ++的内容,而是更加复杂的过程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.