Questions tagged «c++»

有关C ++的问题,C ++是一种静态类型,自由格式,多范式,已编译的通用编程语言。

3
在不填满巨大数组的情况下产生大问题的专业方法:C ++,从数组的一部分释放内存
我正在开发物理模拟,由于我对编程还不熟悉,因此在生成大型程序时会遇到很多问题(主要是内存问题)。我知道动态内存分配和删除(新建/删除等),但是我需要一种更好的方法来构造程序。 假设我正在模拟一个实验,该实验运行了几天,并且采样率非常高。我需要模拟十亿个样本,然后运行它们。 作为一个超级简化的版本,我们将说一个程序采用电压V [i],并将它们加在一起为5: 即NewV [0] = V [0] + V [1] + V [2] + V [3] + V [4] 然后NewV [1] = V [1] + V [2] + V [3] + V [4] + V [5] 然后NewV [2] = V [2] + V [3] + V [4] + …
20 c++  data  memory  array  dynamic 

7
如何最好地保护传递给std :: string参数的0?
我刚刚意识到一些令人不安的事情。每次我编写一个接受std::string参数为a 的方法时,我都会向不确定的行为敞开大门。 例如,这... void myMethod(const std::string& s) { /* Do something with s. */ } 可以这样称呼 char* s = 0; myMethod(s); ...而且我无能为力(我知道)无法阻止它。 所以我的问题是:某人如何捍卫自己呢? 想到的唯一方法是,始终编写接受a std::string作为参数的任何方法的两个版本,例如: void myMethod(const std::string& s) { /* Do something. */ } void myMethod(char* s) { if (s == 0) { throw std::exception("Null passed."); } else { …
20 c++ 

2
为什么Java不将文件名放在args中?
在C和C ++中,main方法将文件名保存在数组的第一个位置argv [0]处。但是,在Java中,文件名不包含在args字符串数组中。 是否有实际原因?我知道这使得通过命令行参数从0开始而不是从1开始进行迭代,但这有好处吗?文件名只是被认为是无用的吗?
20 java  c++  c 

3
编写代码时,我是否必须考虑编译后的机器代码?
例如,我有以下代码: auto z = [](int x) -> int { if (x > 0) { switch (x) { case 2: return 5; case 3: return 6; default: return 1; } } return 0; }; 后来我多次打电话给我。在asm代码中,我看到了使用lambda进行的外部调用。因此,也许我在元编程中获胜,但在asm调试和性能方面是否会输?我是否应该避免使用现代语言功能,宏和其他元编程方面,以确保性能和调试简便性?

1
C ++ 11中auto关键字的动机和陷阱(?)
我最近想知道为什么auto在C ++ 11中选择了关键字来标记必须由编译器推断类型的变量,例如 auto x = 1; 以来 var 在其他编程语言(例如C#,Scala,JavaScript)中似乎更常见,并且 据我所知,autobreaks向后兼容的新语义(它很少使用,但在以前的C ++版本中具有不同的含义,请参见例如此处)。 我想问一下是否有一个特殊的原因选择auto(赞成var或其他任何关键字)。在C ++ 11标准发布之前是否有关于此问题的特定讨论? 另外,在使用C ++ 11编译器重新编译旧版C ++代码时,是否应该注意任何可能的不兼容性?

7
头文件实际上好吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我发现头文件在浏览C ++源文件时很有用,因为它们给出了类中所有函数和数据成员的“摘要”。为什么这么多其他语言(例如Ruby,Python,Java等)没有这样的功能?这是C ++的详细信息派上用场的地方吗?
20 c++ 

5
为什么现代图书馆不使用OOP
我是初学者级C ++程序员,但是我对语言的概念非常了解。当我开始学习外部C ++库(例如SDL,OpenGL)(也许还有其他东西)时,令我惊讶的是,我发现它们根本不使用C ++概念。 例如,SDL和OpenGL都不使用类或异常,而倾向于使用函数和错误代码。在OpenGL中,我看到过诸如glVertex2f之类的函数,该函数需要2个float变量作为输入,并且作为模板可能会更好。而且,这些库有时使用marcos,而使用宏函数似乎是一个坏习惯,这是一个普遍的共识。 总而言之,它们似乎更多地是用C风格而不是C ++风格编写的。但是它们是完全不同的语言,不是吗? 问题是:为什么现代图书馆没有利用它们所写语言的优势?

3
单元测试C ++:要测试什么?
TL; DR 编写好的,有用的测试很困难,并且在C ++中代价很高。您是否有经验的开发人员可以就什么以及何时进行测试分享您的理论依据? 很长的故事 我曾经做过测试驱动的开发,实际上是整个团队,但对我们来说效果不佳。我们有很多测试,但是它们似乎从来没有覆盖我们有实际错误和回归的情况-通常是在单元交互时发生的,而不是因为它们孤立的行为而发生。 这通常很难在单元级别进行测试,以至于我们停止了TDD测试(组件确实可以加快开发速度),而花了更多时间增加集成测试的覆盖范围。尽管小型单元测试从未捕获任何实际的错误,并且基本上只是维护开销,但集成测试确实值得付出努力。 现在,我继承了一个新项目,并且想知道如何进行测试。它是本机C ++ / OpenGL应用程序,因此集成测试并不是真正的选择。但是C ++中的单元测试比Java中的要难一些(您必须显式地制作东西virtual),并且该程序不是很面向对象的,所以我无法模拟/存根一些东西。 我不想为了编写测试而仅仅为了编写一些测试而拆开并OO化整个过程。所以我问你:我应该为测试写什么?例如: 我希望经常更改的函数/类? 难以手动测试的函数/类? 已经易于测试的功能/类? 我开始研究一些受人尊敬的C ++代码库,以了解它们如何进行测试。现在,我正在研究Chromium源代码,但发现很难从代码中提取其测试依据。如果有人有一个很好的例子或关于C ++用户(委员会,书籍作者,Google,Facebook,Microsoft等人的看法)如何发表文章的帖子,那将特别有帮助。 更新资料 自编写此书以来,我一直在这个网站和网络上进行搜索。找到了一些好东西: 什么时候不进行单元测试? /programming/109432/what-not-to-test-when-it-comes-to-unit-testing http://junit.sourceforge.net/doc/faq/faq.htm#best 可悲的是,所有这些都是以Java / C#为中心的。用Java / C#编写大量测试不是一个大问题,因此收益通常超过了成本。 但是正如我上面所写,在C ++中要困难得多。尤其是如果您的代码库不是那么OO,那么您就必须认真弄乱事情,以获得良好的单元测试覆盖率。例如:我继承的应用程序具有一个Graphics名称空间,该名称空间是OpenGL之上的薄层。为了测试任何实体(它们都直接使用其功能),我必须将其变成一个接口和一个类,并将其注入所有实体中。那只是一个例子。 因此,在回答这个问题时,请记住,我必须在编写测试方面投入大量资金。

13
为什么操作系统会在C和C ++中做底层工作?为什么不只是C ++?
在Windows的Wikipedia页面上,它指出Windows是用Assembly语言编写的,用于引导加载程序和任务切换器,以及C 和 C ++语言的内核例程。 IIRC,您可以从extern "C"'d块调用C ++函数。我可以将C用于内核函数,这样纯C应用程序就可以使用它们(诸如此类printf),但是如果它们只能包装在一个extern "C "块中,那么为什么要用C语言编写代码?

6
我是否应该使用新的C ++ 11“自动”功能,尤其是在循环中?
使用auto关键字的利弊是什么,尤其是在for循环中? for(std::vector<T>::iterator it = x.begin(); it != x.end(); it++ ) { it->something(); } for(std::map<T>::iterator it = x.begin(); it != x.end(); it++ ) { it->second->something(); } for(auto it = x.begin(); it != x.end(); it++ ) { it->?? } 似乎,如果您不知道是否有地图或矢量的迭代器,就不会使用first还是second直接访问对象的属性,是吗? 这让我想起了C#关于是否使用关键字的争论var。到目前为止,我得到的印象是,在C ++世界中,人们auto比var在C#世界中更愿意采用关键词。对我来说,我的第一个直觉是我想知道变量的类型,以便知道可以对它执行哪些操作。
20 c++  c++11 

6
5的规则-是否使用?
的3中的规则(5规则状态在新的C ++标准): 如果您需要自己显式声明析构函数,复制构造函数或复制赋值运算符,则可能需要显式声明这三个函数。 但是,另一方面,马丁的“ 清理代码 ”建议删除所有空的构造函数和析构函数(第293页,G12:Clutter): 没有实现的默认构造函数有什么用?它要做的只是用毫无意义的工件使代码混乱。 那么,如何处理这两种相反的意见呢?是否应该真正实现空的构造函数/析构函数? 下一个示例准确地说明了我的意思: #include <iostream> #include <memory> struct A { A( const int value ) : v( new int( value ) ) {} ~A(){} A( const A & other ) : v( new int( *other.v ) ) {} A& operator=( const A & other …

8
如何在团队成员之间传播对通用编程的认识?
我住在一个人们相信的环境中: Java泛型是专门用于库编写而不是实际编码的功能。 C ++是一种OO编程语言;template是可选的和可避免的功能 但是,这些人高度依赖使用通用编程编写的库(例如STL,Java容器)。如果我使用templates或编写代码generics,则代码审阅者很可能会拒绝它,并会以“正确/可理解/优雅”的方式发表评论以编写代码。 这种心态适用于普通程序员到高级经理。没有出路,因为90%的时间里,这些人都有自己的游说手段。 解释它们的最佳方法是什么(不被割断),同时编写构成OO和通用编程的代码的实用方法是什么?
20 java  c++  templates  generics 

5
单元测试是否会导致过早的泛化(特别是在C ++中)?
初步说明 我不会区分不同种类的测试,在这些站点上已经有一些与此有关的问题。 我会采取什么样的存在,并且说:单位的“测试应用程序的最小单位可分离”的意义测试从这个问题实际上导出 隔离问题 程序的最小可隔离单元是什么。好吧,正如我所见,它(高度?)取决于您所使用的语言。 Micheal Feathers谈到接缝的概念:[WEwLC,p31] 接缝是一个您可以更改程序行为而无需在该位置进行编辑的位置。 而且,在不进行细节讨论的情况下,我了解到在单元测试的上下文中存在的缝隙—在程序中可以使“测试”与“单元”进行交互。 例子 单元测试-尤其是C ++中的单元测试-要求被测试的代码添加更多的接缝,这对于给定的问题是严格要求的。 例: 在非虚拟实现就足够的地方添加虚拟接口 拆分-generalizing(?)-一个(较小的)类,进一步“恰好”以方便添加测试。 将单个可执行项目拆分为看似“独立”的库,“公正”以便于为测试而独立地编译它们。 问题 我将尝试一些可能会问相同问题的版本: 单元测试是“仅”对应用程序代码进行结构化的一种方式,这对单元测试是有益的,还是实际上对应用程序结构有利。 是需要的代码泛化作出任何它的单位可测试非常有用,但单元测试? 添加单元测试是否会强制一个泛化? 从问题域的角度来看,形状单元测试对代码的“总是”作用力是否也对代码总体而言是一种良好的形状? 我记得有一条经验法则,直到您需要/直到有第二个地方使用该代码时,它才会泛化。使用单元测试,总是有第二个地方使用代码-即单元测试。那么,这个理由足以概括吗?

8
开发时与同事打交道,需要建议[关闭]
很难说出这里的要求。这个问题是模棱两可,含糊,不完整,过于宽泛或夸张的,不能以当前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 8年前关闭。 此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 8年前。 我开发了当前的项目架构,并开始自行开发(达到revision 40)。 我们正在开发一个简单的地铁路线框架,我的设计似乎做得非常好- 几个主要模型,相应的视图,主要逻辑和数据结构均按“应有的方式”建模,并且与渲染完全分离,并且还实现了算法部分除了主要模型之外,交叉点数量很少。 我将这种设计称为可扩展,可定制,易于实现的设计,它主要基于“黑匣子交互”进行交互,而且很好。 现在,完成了什么: 我开始了相应接口的一些实现,移植了一些方便的库,并为一些应用程序部分编写了实现存根。 我有描述编码风格的文档以及该编码风格用法的示例(我自己的书面代码)。 我强迫使用或多或少的现代C++开发技术,包括no-delete代码(通过智能指针包装)等。 我记录了具体接口实现的目的以及应如何使用它们。 单元测试(大多数情况下是集成测试,因为没有很多“实际”代码)和所有核心抽象的一组模拟。 我缺席了12天。 我们现在拥有什么(该项目是由团队的其他4位成员开发的): 3个不同的编码风格遍布项目(我猜,他们两个人同意使用相同的样式:),同样适用于我们的抽象的命名(例如CommonPathData.h,SubwaySchemeStructures.h),它们基本上头宣布了一些数据结构。 绝对缺乏有关最近实施的零件的文档。 我最近称之为“ single-purpose-abstraction现在”的事件至少可以处理2种不同类型的事件,与其他部分的关系紧密等等。 现在,一半的已使用接口包含成员变量(sic!)。 原始指针的用法几乎无处不在。 单元测试已禁用,因为“ (Rev.57) They are unnecessary for this project”。 ... (可能不是全部)。 提交历史记录表明,我的设计被认为是一种过大的技巧,人们开始将其与个人自行车和重新实现的车轮结合起来,然后在集成代码块时遇到了问题。 现在-该项目仍然只执行其少量工作,我们存在严重的集成问题,我假设有一些内存泄漏。 在这种情况下有什么办法可以做? 我确实意识到我的所有努力都没有任何好处,但是截止日期很快就到了,我们必须做些事情。有人有类似情况吗? 基本上,我认为为该项目做好一个良好的开端(好吧,我已尽力)可能会带来一些好处,但是,我知道我错了。

9
通用编程技术可加快编码时间
我正在准备一场编程比赛,我们必须使用C ++进行编程,而这一切都是关于在短时间内生成有效的代码。一个例子是使用宏获取最少两个整数或使用内存集初始化数组(但是有人告诉我,您既不应该在这里使用它)。 这就引出了一个问题,在实际工作中要使用哪种编码技术?
20 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.