菜鸟问题,想自学C/C++开发桌面应用程序,想问的是,现在桌面应用还有用C/C++的吗?或者说是否广泛使用,是不是都是Java了?

2013-08-09 11:22:43 +08:00
 rteta
还有 我卡在算法(神吗深度广度优先之类的东东)这点上卡了2天都还迷糊着,
有大牛这段经历花了多久? 我是不是不适合搞开发?
LZ目前 小屁公司运维(装OS,接网线,总之就打杂)想转开发。
求指导。
14365 次点击
所在节点    程序员
37 条回复
cdffh
2013-08-09 22:07:07 +08:00
推荐c++和qt。很好用
rteta
2013-08-09 22:49:46 +08:00
@cdffh 给推荐本书?
jybox
2013-08-09 22:53:16 +08:00
@PotatoBrother 你还来推荐别人呢...

Windows的话,如果是一般的应用,.Net确实是最佳选择。
跨平台桌面应用的话C++比较多一点,Java倒也是选择之一..
RisingV
2013-08-09 22:58:40 +08:00
@itfanr 嗯,都同意。但除了C++ ,它是“为了让事情变得复杂,提高程序员薪水而生的”,这是Bjarne Stroustrup自己说的,哈哈
Geeker
2013-08-09 22:59:07 +08:00
可以用Qt,但是还是推荐C#吧,上手快。
rteta
2013-08-09 23:22:41 +08:00
越看越迷糊
funcman
2013-08-09 23:45:02 +08:00
@rteta 写桌面不太需要算法。排序算法学一学即可,图的算法都很少用到。做这个几乎不需要你设计算法,用已有的即可,会编程实现就行。
rteta
2013-08-09 23:46:14 +08:00
@funcman thanks
funcman
2013-08-10 01:09:26 +08:00
C++还是.Net,要看做什么。

.Net做项目,考虑到XP用户没有装.Net Framework,需要把.Net Framework打包进安装程序。安装包会比较大,并且安装速度稍慢。这样,用户体验就要差一些。所以很多流行的免费软件不用.Net

.Net经常被说成COM的升级版。用COM的软件,发布起来就有点麻烦了。需要做一下DLL注册。而国内用户经常喜欢可以“绿化”的软件,直接拷来就用,连安装都不要了。

C++做的桌面应用,就没这些麻烦。把所有依赖的DLL都放到EXE目录下,就能跑,不需要装重量级的库。(如果用到COM接口的库,还是需要注册一下)

开发游戏,主要用C/C++,和诸如Lua、Python这样的脚本语言。但是游戏开发需要写很多编辑器供策划和美术使用,编辑器使用的技术也就是桌面应用开发的技术。目前这块,.Net和Qt是最流行的;MFC也有使用,但它实在不适合快速开发,用得极少;另外也有使用C++Builder的,只不过C++Builder被宝兰卖给小厂了,没多少影响力,但是用它开发编辑器还是蛮舒服的。

.Net在编辑器开发上的主要问题是,.Net有自己的内存模型,和C++的模型不太一样,调试时容易被坑。游戏引擎肯定是本地代码的,编辑器肯定需要调用引擎代码。实现起来倒不难,不需要把引擎包成.Net的DLL,直接用.Net的C++/CLI来写

游戏引擎肯定是本地代码的,编辑器要调用游戏引擎,游戏引擎一般以dll的形式为引擎提供功能。如果用C#来做,需要把引擎的dll用C++/CLI包装成托管dll。但其实直接用C++/CLI来写编辑器就挺好的,没必要用C#。参考资料看C#的就可以了,反正都是调用.Net Framework的库,语法上有些不同。不过托管代码和本地代码的内存模型不同,调试起来会遇到坑。
funcman
2013-08-10 01:36:20 +08:00
C#相对于C/C++的优势在于,C#有垃圾回收。

垃圾回收的好处,不在于可以使经常忘记free内存的菜鸟也能写代码。

一个复杂的系统,对象会在很多个作用域中被引用。作用域与作用域之间,如果还要交换对象的引起情况,那系统模块间的耦合就太大了。简单的系统应该是,我在这个作用域中引用了一个对象,不需要关心这个对象是否在其它作用域被引用。既然不关心,那么也没办法靠判断来决定是否释放对象。对象什么时候释放,应该由一个底层的机制来解决。如果没有这种机制,再小心的老手,也写不出没有内存资源泄露的程序。

C/C++编写系统,一般靠引用计数来管理对象何时才能消亡。如果不用引用计数,那只能统一生产对象再统一释放,内存够倒还好。C/C++其实也有一些垃圾回收(gc)工具库,不过应用得不广泛。gc能回收的内存,必须是gc提供的内存分配功能获取的内存。但是C/C++有自己的malloc/free,可能会出现free掉gc管理的内存的情况。C++标准其实想加入gc,但是手动管理的存在,一直不太好加。

大多数时候,引用计数够用了,gc毕竟太复杂。底层的东西,太复杂不大好。微软以前长久地被dll地狱问题困扰,到.Net Framework的推出时才得以解决。而Linux、OSX这些系统,只不过简单的约定了一下版本号,就解决了这个问题。微软在.Net Framework上花了巨大的精力,结果现在还是有很多人不用它。
iveney
2013-08-10 03:56:35 +08:00
@funcman C++ 已经在提倡使用 shared_ptr, unique_ptr 来管理对象,而不是手工管理指针了。

好奇现在是不是 Windows app 都全用 .NET/C# 了。很久之前自学 Windows App Dev 时还是用的 Win32 API 与 MFC/C++。
rteta
2013-08-10 09:21:41 +08:00
好吧 我知道了 谢谢大家热心回答 !
funcman
2013-08-10 10:13:01 +08:00
@iveney shared_ptr毕竟是C++11才加入的,如果用老一点的编译器,你还得用boost。shared_ptr出现之前,引用计数就大量使用了。

WinForms的开发,比Win32/MFC要容易多了,易用程度跟VB差不多。
miller
2013-08-10 10:55:43 +08:00
毕业以后在一家互联网公司做了两年的windows桌面客户端软件开发。
我们这边客户端,大都使用C++开发。
就我们项目组来说,用了boost的很多功能,比如boost.smart_ptr管理内存,boost.test单元测试,boost.thread写多线程等等。界面库也是自己开发的。
stackpop
2013-08-10 12:18:19 +08:00
如果纯粹是桌面开发的话,windows下多数还是C++、C#开发,MFC性能比较好, winform和wpf之类的让界面开发变得非常简单。当然,你也可以学习QT。

其实业务逻辑才是难点,界面是很简单的。算法这种东西最好还是要有基础的知识储备再看,各种数据结构要理解。

理解DFS要先理解递归,树(解答树)和图这种基础的数据结构。BFS类似。

另外这两种算法有固定的模式,难点通常在于如何构建解答树、状态的保存、判重等。
yangxin0
2013-08-11 09:12:15 +08:00
@cdffh 你现在用QT么?
cdffh
2013-08-11 17:20:26 +08:00
@yangxin0 之前用过一段时间,感觉还不错,现在用的不多了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/78535

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX