Questions tagged «c++»

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

2
按位或与添加标志
我见过其他人以前使用位或来组合标志: #define RUN 0x01 #define JUMP 0x02 #define SHOOT 0x04 const byte madPerson = RUN | JUMP | SHOOT; 我也是这么做的。 但是我也看到了使用加法的一些(不是很多)组合标志: #define RUN 0x01 #define JUMP 0x02 #define SHOOT 0x04 const byte madPerson = RUN + JUMP + SHOOT; 哪一个更“可读”?(您认为更多人会认出哪个?)这样做的“标准”方法是什么?你更倾向哪个?
16 c++  operators 

2
与std :: bitset相比,c风格的位操作有什么优势吗?
我几乎只在C ++ 11/14中工作,通常在看到这样的代码时会畏缩: std::int64_t mArray; mArray |= someMask << 1; 这只是一个例子。我说的是一般的按位操作。在C ++中,真的有什么意义吗?上面的内容容易引起误解且容易出错,而使用std::bitset可以使您: std::bitset通过调整模板参数并让实现负责其余工作,可以更轻松地根据需要修改的大小,以及 花更少的时间弄清楚正在发生的事情(并可能犯错误),并std::bitset以类似于std::array或其他数据容器的方式编写。 我的问题是;除了向后兼容以外,还有什么理由不使用std::bitset原始类型吗?


6
开发单个可执行文件时使用不同的C ++编译器和语言版本
我们公司将购买大量且非常复杂的卫星通信源代码。 它使用C ++进行编码,我们还将使用C ++对其添加的代码进行编码,将我们的代码与购买的代码链接到单个可执行单元中。 是否有必要使用与开发购买的代码相同的编译器和相同的编译器版本? 我们是否必须使用与所购买代码相同的C ++版本?如果不使用2014,我们可能想使用它的某些功能,但是如果混合使用不同的版本可能会出现问题,则不要。 从理论上讲,当然,这无关紧要,尤其是语言版本,但是可以想象,不同版本的编译器将生成不同的目标代码,从而可能导致时序差异等。 我们应该注意什么?
15 c++ 

4
size_t或int用于尺寸,索引等
在C ++中,size_t(或更正确地说T::size_type,通常是“ 类型” size_t;即unsigned类型)被用作的返回值size(),的自变量operator[]等(请参见std::vector等)。 另一方面,.NET语言出于相同目的使用int(并且(可选long))。实际上,不需要 CLS兼容语言来支持unsigned类型。 由于.NET是比C ++新的东西告诉我,可能会有问题,使用unsigned int连供的事情,“不可能”像数组索引或长度为负。C ++的方法是否“向后兼容”?还是这两种方法之间存在真实而重大的设计折衷? 为什么这么重要?好吧……对于C ++中的新多维类,我应该使用什么?size_t还是int? struct Foo final // e.g., image, matrix, etc. { typedef int32_t /* or int64_t*/ dimension_type; // *OR* always "size_t" ? typedef size_t size_type; // c.f., std::vector<> dimension_type bar_; // maybe rows, or x dimension_type baz_; // e.g., columns, …
15 c#  c++  array 

6
内存对齐有多重要?仍然重要吗?
从现在开始,我已经搜索并阅读了很多有关内存对齐方式,其工作方式和使用方法的内容。我现在找到的最相关的文章是这篇。 但是即使如此,我仍然对此有一些疑问: 在嵌入式系统之外,我们经常在计算机中拥有大量内存,这使内存管理的批评家减少了很多。我完全致力于优化,但是现在,如果我们将相同的程序与或进行比较,是否真的可以有所作为?没有它的内存重新排列和对齐? 内存对齐还有其他优势吗?我在某处读到CPU可以更好地/更快地使用对齐的内存,因为这样可以减少处理的指令(如果你们中的某个人有一篇文章/基准的链接?),在那种情况下,区别真的很重要吗?有没有比这两个更多的优势? 在第5章的文章链接中,作者说: 当心:在C ++中,看起来像结构的类可能会违反此规则!(它们是否取决于基类和虚拟成员函数的实现方式,并随编译器的不同而不同。) 本文主要讨论结构,但是局部变量声明是否也受此需求影响? 您是否知道内存对齐在C ++中如何工作,因为它似乎有些差异? 前一个问题包含“对齐”一词,但未提供上述问题的任何答案。

1
std :: vector <bool>是怎么产生的?
如今,几乎所有的C ++开发人员都同意这std::vector&lt;bool&gt;是一个错误,因为它显然不是容器,而且其用例std::bitset无论如何都与大多数情况重叠。 它是如何被选为标准的?当时有争议吗?主要的支持论据是什么?
15 c++  history  stl 

2
应该从std :: exception派生/继承吗?
在设计我的第一个“严肃的” C ++库时,我在问自己: 从中衍生出某些例外std::exception是后代吗? 即使阅读后 设计异常类 为我的图书馆实施的“异常数量”是多少? 我还不确定。因为,除了常见的(但可能不是很好)的做法之外,我将以库用户的身份假设,std::exception仅当标准库函数在库实现中失败时,库函数才会抛出s,而它对此无能为力。但仍然,在编写应用程序代码时,对我来说非常方便,并且恕我直言,好看的只是抛出一个std::runtime_error。另外,我的用户还可以依赖定义的最小接口,例如what()或代码。 例如,我的用户提供了错误的参数,比抛出a更方便std::invalid_argument吗?因此,与在其他代码中看到的std :: exception的常用用法结合在一起:为什么不走得更远,从您的自定义异常类(例如lib_foo_exception)以及std::exception。 有什么想法吗?
15 c++  exceptions 

4
OOP应用程序中的参数管理
我正在用C ++编写一个中等大小的OOP应用程序,作为实践OOP原理的一种方法。 我的项目中有几个类,其中一些需要访问运行时配置参数。这些参数是在应用程序启动期间从多个来源读取的。有些是从用户home-dir中的配置文件读取的,有些是命令行参数(argv)。 所以我创建了一个类ConfigBlock。此类读取所有参数源并将其存储在适当的数据结构中。示例是路径和文件名,用户可以在配置文件或--verbose CLI标志中更改它们。然后,可以调用ConfigBlock.GetVerboseLevel()以读取此特定参数。 我的问题:在一个类中收集所有此类运行时配置数据是一种好习惯吗? 然后,我的班级需要访问所有这些参数。我可以想到几种方法来实现这一目标,但是我不确定该采取哪种方法。类的构造函数可以是对我的ConfigBlock的给定引用,例如 public: MyGreatClass(ConfigBlock &amp;config); 或者,它们仅包含标头“ CodingBlock.h”,其中包含我的CodingBlock的定义: extern CodingBlock MyCodingBlock; 然后,仅类.cpp文件需要包含和使用ConfigBlock内容。 .h文件不会将此接口引入类的用户。但是,ConfigBlock的接口仍然存在,但是从.h文件中隐藏了该接口。 这样隐藏起来好吗? 我希望接口尽可能小,但最后,我想每个需要配置参数的类都必须与我的ConfigBlock连接。但是,这种连接应该是什么样的?

3
面向对象语言的非面向对象编程
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 最近,我被分配了一项任务,即使用面向对象编程来创建具有加,减,乘,除和乘幂功能的计算器。我成功完成了这项任务。但是之后,我重新编程了整个程序,而没有使用面向对象的技术/方法。 我注意到我的代码长度大大减少了,这是可以理解的。所以我的问题是,什么时候应该使用面向对象编程?是否可以使用面向对象的语言来创建没有面向对象的程序?请帮助我解决这一问题。 PS:我不是要在这里告诉我面向对象编程优于过程编程的优点。

6
使用朋友类在C ++中进行单元测试私有方法
我知道这是一个有争议的做法,但是让我们假设这对我来说是最佳选择。我想知道执行此操作的实际技术是什么。我看到的方法是这样的: 1)与我要测试的方法的班级做一个朋友班。 2)在friend类中,创建一个公共方法,该公共方法调用被测试类的私有方法。 3)测试好友类的公共方法。 这是一个简单的示例来说明上述步骤: #include &lt;iostream&gt; class MyClass { friend class MyFriend; // Step 1 private: int plus_two(int a) { return a + 2; } }; class MyFriend { public: MyFriend(MyClass *mc_ptr_1) { MyClass *mc_ptr = mc_ptr_1; } int plus_two(int a) // Step 2 { return mc_ptr-&gt;plus_two(a); } private: …

2
哪个更好:一堆吸气剂或带有选择字符串参数的1个方法?
我们的知识领域涉及人们赤脚行走在压力记录板上。如果在传感器数据中识别出人脚,我们会进行图像识别,从而产生“脚”类对象。 必须对脚的数据执行一些计算。 现在,哪种API更好: class Foot : public RecognizedObject { MaxPressureFrame getMaxPressureFrame(); FootAxis getFootAxis(); AnatomicalZones getAnatomicalZones(); // + similar getters for other calculations // ... } 要么: class Foot : public RecognizedObject { virtual CalculationBase getCalculation(QString aName); // ... } 现在,我可以提出很多优点和缺点,但是我不能真正决定哪个最重要。请注意,这是最终用户应用程序,而不是我们出售的软件库。 有什么建议吗? 第一种方法的一些专家可能是: 吻-一切都非常具体。API,但实施也是如此。 强类型返回值。 从此类继承是万无一失的。什么都不能覆盖,只能添加。 API是非常封闭的,什么都不会进入,什么都不能被覆盖,所以更少的地方会出错。 一些缺点: 随着我们发明的每一项新计算都被添加到列表中,吸气剂的数量将会增加 API更可能会更改,如果引入了重大更改,我们需要一个新的API版本,即Foot2。 如果在其他项目中重复使用该类,我们可能不需要进行所有计算 …

7
在C和C ++中,哪些方法可以防止在需要等价(==)的情况下意外使用工作分配(=)?
在C和C ++中,编写带有严重错误的以下代码非常容易。 char responseChar = getchar(); int confirmExit = 'y' == tolower(responseChar); if (confirmExit = 1) { exit(0); } 错误是if语句应该是: if (confirmExit == 1) 按照编码,它将每次退出,因为confirmExit发生了变量分配,然后confirmExit将其用作表达式的结果。 是否有防止这种错误的好方法?

2
WinRT真的可以仅在边界使用吗?
Microsoft(主要是Herb Sutter)建议在将WinRT与C ++ / CX一起使用时,将WinRT保留在应用程序的边界,并保持应用程序的核心使用标准ISO C ++编写。 我一直在编写一个我想使其保持可移植性的应用程序,所以我的核心功能是用标准C ++编写的,现在我正尝试使用C ++ / CX为其编写Metro风格的前端。但是,我对这种方法有一些疑问。例如,如果要将用户定义的C ++类型的向量推入XAML ListView控件,则必须将用户定义的类型包装为WinRT引用/值类型,以将其存储在中Vector^。通过这种方法,我不可避免地要用WinRT类包装大部分C ++类。 这是我第一次尝试用C ++编写可移植的本机应用程序。保持WinRT这样的界限真的可行吗?带有平台特定边界的这种类型的便携式内核又将如何处理?
15 c++  portability  winrt 

4
用C ++编写构建脚本是否有意义?
我正在使用CMake生成我的项目IDE / makefile,但是我仍然需要调用自定义“脚本”来操纵我的编译文件甚至生成代码。 在以前的项目中,我一直在使用Python,而且还可以,但是现在在我正在处理的两个非常大的项目中管理很多依赖项时遇到了严重的麻烦,因此我想尽可能减少所有地方的依赖项。 有人建议我使用C ++编写我的构建脚本,而不是为此添加语言依赖。项目主题本身已经使用C ++,所以我可以看到几个优点: 要构建整个项目,只需要一个C ++编译器和CMake,就没有其他必要了(所有其他依赖项都是C或C ++); C ++类型的安全性(使用现代C ++时)使一切变得更容易“正确”; 它也是我所熟悉的语言,因此即使我能够编写一些不错的Python代码,也可以更轻松地使用它。 潜在的执行速度提升(但我认为这不会真正被察觉); 但是,我认为可能会有一些缺点,并且由于我尚未尝试,所以不确定真正的影响: 编写代码的时间可能会更长(也就是说,我不确定,因为我在C ++中足够高效,可以编写可以快速工作的东西,因此对于该系统来说,编写它不会太长)(编译时间不应在这种情况下是一个问题); 我必须假定我将作为输入阅读的所有文本文件都在UTF-8中,我不确定可以在运行时使用C ++轻松地对其进行检查,并且该语言不会为您进行检查。 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.