我知道 C++ 是一种非常复杂的语言,需要多年的实践才能掌握。
考虑到这一点,您是否知道一个测试所有 C++ 主要特性(继承、指针、内存管理等)的小项目(大约 1k 的 loc)。
问题是我是一名 Java/Python 程序员,我真的很想学习 C++,所以我学习 C++ 已经有一段时间了,但除了小练习之外,我还没有测试过我学到的任何东西。
我想把所有这些知识付诸实践。
单独这样做,您将获得许多有害的习惯。最好到一家C++开发能力强的公司实习,并在指导下进行培训。
C++ 就像没有安全别针的手榴弹——看起来很酷,你听说所有“真正的专业人士”都在使用它,但你不知道它什么时候会爆炸。大量的功能可以用于善或恶,而不知道它是真的好还是坏。这就是为什么这里必须提供指导。
内存管理器。这应该让你思考:
我不确定测试所有主要功能的任何东西。它们有很多,有些很少一起使用(想到模板和虚函数。两者都实现了一种形式的多态性,因此您经常根据需要使用其中一个。)
一个涉及所有重要特性的合适项目可能是一些看起来很简单的事情,比如编写一个正确的容器类,类似于 std::vector 或 std::list。确保异常安全、迭代器有效性、所有操作的适当时间复杂度以及标准中规定的所有其他要求。
这个问题以及大多数其他项目的问题是,你不会真正知道什么时候完成。制作一个可调整大小的数组可能需要 50 行代码和 20 分钟的时间。然后初学者会认为他已经完成了。使其异常安全要求您能够发现类可能因异常而陷入不一致状态的所有地方。
这是 C++ 的一种普遍问题。很容易认为你明白了,编译器当然不会通知你忘记处理的方面。所以你可能认为你的代码是完美的,但它会在各种奇怪的特殊情况下崩溃。
正如尖牙所说,对于像 C++ 这样乱七八糟的语言,自己编写代码是有风险的。很容易陷入“我写了一些代码,它可以编译,它似乎可以运行。因此它是正确的”的陷阱。当然,您可以在此处或其他站点上发布您的代码以供审查,或者只是通过阅读文档来补充您的编码以获取实际的高质量 C++ 代码(大多数 boost 库往往具有全面的文档,指定各种设计决策的基本原理,以及它如何安全地处理 C++ 中容易出现的所有奇怪的特殊情况。当然,C++ 标准本身将是另一个极好的资源。无论哪种情况,这些都可以帮助您确定要注意的问题)
当我学习 C++ 时,我用它来编写自己的语言来编写 Colossal Cave 风格的冒险。像大多数计算机语言一样,它从未出现过,但它确实教会了我很多关于 C++ 的知识。
无论您选择学习 C++ 时要避免的事情都是 GUI 编程,这是一个陷阱,会耗尽您的所有进取心,并可能在此过程中教给您不良的 C++ 习惯。
为了学习 C++,看看很多写得很好的 C++ 代码是很有用的。我认为 Qt 库对此非常好,所以我建议:编写一个 Qt 应用程序。
看看他们如何使用 C++ 并以类似的方式创建您自己的图形组件。
想法: - 股票图表查看器小部件,可连接到金融网站之一并刮取历史数据。- 简单的 Excel,如电子表格小部件。
我建议创建一个基于文本的游戏。这真的帮助我巩固了我的 C++。不需要太长时间,您可以使用您想要的所有功能。自己想出游戏。这样更有趣。
另一个好主意是编写一个简单的数学库,支持向量矩阵等。但是对于今天的库,这只是学术用途。
取决于您想在哪个领域工作。但是,少于 1000 行的代码没有什么值得做的正确的事情。
如果您要编写游戏,请尝试编写俄罗斯方块克隆。
如果您认为您将使用套接字等,那么编写一个简单的聊天/irc 客户端会有所帮助。
您是否有需要抓挠的特定瘙痒?你最后一次认为“这很糟糕,我可以做得更好?”是什么时候。你能做得更好吗?
我建议编写一个俄罗斯方块克隆。您可以通过它学习很多 c++ 概念,并通过 SDL 学习像 SDL 甚至 OpenGL 这样的 2d 库。
拥有一个具有视觉效果的项目总是好的,并且在它结束时您可以播放它。
答案似乎有两个主题:
您需要选择一个可能涉及超过 1K LOC 的项目,才能获得该项目的真实体验。
您还需要与经验丰富的 C++ 开发人员合作,他们可以帮助您思考问题并避免与该语言相关的陷阱。
你可以通过 sourceforge.net 和注册来帮助现有的 C++ 项目来解决这两个问题。只要你不介意你的代码是开源的,你应该能够找到一个现有的项目来学习,以及经验丰富的开发人员,他们可以通过审查你的代码和提供指导来提供帮助。
如果你从一本书中学习,它必须有大量经过深思熟虑的练习,你可以实施和学习。还可以查看大学网站及其 C++ 实验室/作业。
An interactive world: A matrix where each position can be a Void or a Being. A Being is something with a few attributes: age, Time left, gender, neigbor connections, etc. Capable a few interactions: fights, having sex and kids, friendships, etc. Some have special Skills, depending on their fathers (inherited trades)... like ability to kill, ability to make food,, etc... Possible outcomes of those interactions and skills are changes on the self attributes, or creating offspring (when possible), or change neigbor attributes.
At each iteration, print the matrix as symbols/numbers on the console (depending on the attributes, etc), starting from a Biblical iteration 0 (initial conditions of your choice... you're God here).
Now you got some real-life pattern simulator, and learned something about inheritance, polimorfism, virtual functions, instantiation of classes, etc.
I would suggest a simple text editor would be a reasonable goal.
It's a problem domain that you have a good grasp of.
You have memory management issues, library class reuse issues (stl/curses?), pointer issues, and lots of options where derived classes can be used.
For polymorphism, perhaps, you can have the editor read from a keyboard, or suck commands in from a text file.
There is another good one.... dealing with files.
You don't have to cross platform it. You don't have to open source it. You don't have to show it to anyone. You don't even have to finish it. It can be an exercise just for you.