Questions tagged «c++»

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

9
您了解C ++标准有多重要?
我确实尝试搜索,但是没有看到类似的问题(该问题或者我的搜索术语不正确-如果是这样,请随时关闭)。 我是SO的狂热用户,并且我注意到在讨论和回答中有很多C ++标准的引用-而且我不得不承认,我从未阅读过这个特定的文档,这种语言使我的眼睛受伤...所以,问题是,C ++开发人员可以不用阅读本文档就能真正地谋生吗?对于我们这些不从事编写编译器业务的凡人真的重要吗?
11 c++  standards 

4
C ++迭代器,为什么没有迭代器继承的所有迭代器基类
我正在为考试而学习,但是我有一个问题很难解决。 为什么没有迭代器基类存在所有其他迭代器继承的东西? 我猜我的老师是从cpp参考“ http://prntscr.com/mgj542 ”中引用层次结构的,我们必须提供其他原因,而不是为什么? 我知道什么是迭代器(某种),并且它们用于在容器上工作。据我了解,由于底层数据结构可能不同,因此不同的容器具有不同的迭代器,例如,您可以随机访问数组,但不能访问链表,并且不同的容器需要不同的遍历它们的方式。 根据容器的不同,它们可能是专门的模板,对吗?
11 c++  iterator 

1
在C ++中移动语义-局部变量的移动返回
我的理解是,在C ++ 11中,当您按值从函数返回局部变量时,允许编译器将该变量视为r值引用,并将其“移出”函数以返回它(如果当然不会发生RVO / NRVO)。 我的问题是,这不能破坏现有代码吗? 考虑以下代码: #include <iostream> #include <string> struct bar { bar(const std::string& str) : _str(str) {} bar(const bar&) = delete; bar(bar&& other) : _str(std::move(other._str)) {other._str = "Stolen";} void print() {std::cout << _str << std::endl;} std::string _str; }; struct foo { foo(bar& b) : _b(b) {} ~foo() …
11 c++  c++11 

3
混淆C ++应用程序代码重要吗?
在Java世界中,有时似乎是一个问题,但是C ++呢?有不同的解决方案吗? 我在考虑这样一个事实,即有人可以用同一库的不同版本替换特定操作系统的C ++库,但是充满了调试符号以了解我的代码的作用。使用标准库或流行库是一件好事吗? 在Windows下将某些dll库替换为该库的“调试版本”时,也会发生这种情况。首选静态编译更好吗?在商业应用程序中,我看到针对其应用程序的核心,它们静态地编译了所有内容,并且在大多数情况下,dll(通常是动态库)用于提供一些第三方技术,例如反盗版解决方案(我在许多游戏中都看到了这一点) ),GUI库(如Qt),OS库等。 静态编译是否等效于Java世界中的混淆处理?用更好的术语来说,这是保护代码的最佳,最实惠的解决方案吗?

5
如何解决我的C ++代码中的类相互依赖性?
在我的C ++项目中,我有两个类,Particle和Contact。在Particle该类中,我有一个成员变量std::vector<Contact> contacts,其中包含Particle对象的所有触点以及相应的成员函数getContacts()和addContact(Contact cont)。因此,在“ Particle.h”中,我包括“ Contact.h”。 在Contact该类中,我想将代码添加到构造函数中Contact,以调用Particle::addContact(Contact cont),以便contacts针对Particle在其间Contact添加对象的两个对象进行更新。因此,我必须在“ Contact.cpp”中包含“ Particle.h”。 我的问题是这是否可接受/良好的编码习惯,如果不能,那么哪种更好的方式来实现我要实现的目标(简单地说,每当有新联系人时,自动更新特定粒子的联系人列表)被建造)。 这些类别将由Network具有N个粒子(std::vector<Particle> particles)和Nc个接触(std::vector<Contact> contacts)的类别联系在一起。但是我希望能够拥有类似的功能particles[0].getContacts()– Particle在这种情况下可以在类中使用这样的功能,还是为此目的在C ++中有更好的关联“结构”(在另一个类中使用两个相关类) 。 在此方面,我可能需要转变看法。由于这两个类是由一个Network类对象连接的,因此典型的代码/类组织是具有完全由该Network对象控制的连接信息(因为Particle对象不应知道其联系,因此,它不应具有getContacts()成员)功能)。然后,为了知道特定粒子具有什么接触,我将需要通过Network对象(例如使用network.getContacts(Particle particle))获得该信息。 具有粒子粒子知识的C ++类设计是否也不太典型(也许甚至不鼓励),也就是(具有通过网络对象或粒子粒子访问信息的多种方式),无论哪种方式看起来更方便)?

3
依赖注入:我应该创建一个Car类来容纳其所有零件吗?
我的C ++应用程序中有很多赛车都包含在RaceTrack中。 每辆汽车由数百个零件组成。每个部分都依赖于另外一两个部分。 我已经在DI和Mark Seemann的书上阅读了很多SO问题,并且看起来我不应该为了容纳汽车零件而定义Car类,因为所有汽车零件都将相互依赖,而零件的本质就是汽车。我对吗? 因此,当我将所有赛车放入RaceTrack时,将没有汽车实体,而是很多汽车零件,这取决于彼此在赛道上的比赛??我对吗? 编辑: 很长时间以来,我都在编写汽车类课程,因为对于我来说,如果我编写汽车逻辑学,很显然我需要汽车类。但是使用DI并不是很明显。还是想知道,如果我没有定义角色,那么不创建Car类是DI的惯用做法吗? 我的意思是,可以在没有用于整体代表汽车的实例的情况下,为驾驶人员配备SteeringWheel,为维修人员提供BoltsAndNuts车轮以及其他各种有趣的接口吗?

5
在C ++中优化冗余字符串分配
我有一个相当复杂的C ++组件,其性能已成为问题。分析表明,大多数执行时间只是花在为std::strings 分配内存上。 我知道这些字符串之间有很多冗余。少数值非常频繁地重复,但也有很多唯一值。字符串通常很短。 我现在只是在考虑以某种方式重用那些频繁的分配是否有意义。代替1000个指向1000个不同的“ foobar”值的指针,我可以有1000个指向一个“ foobar”值的指针。这样可以提高内存效率,这是一个不错的选择,但是我在这里最担心的是延迟。 我猜一个选择是维护某种已经分配了值的注册表,但是是否有可能使注册表查找比冗余内存分配更快?这是可行的方法吗?

3
避免构造函数有很多参数
所以我有一个工厂,可以创建不同类的对象。可能的类都是从抽象祖先派生的。工厂具有配置文件(JSON语法),并根据用户的配置来决定要创建哪个类。 为此,工厂使用boost :: property_tree进行JSON解析。他遍历ptree并决定要创建哪个具体对象。 但是,产品对象具有许多字段(属性)。根据具体的类,对象具有大约5-10个属性,将来可能会更多。 因此,我不确定对象的构造函数应如何。我可以想到两种解决方案: 1)产品的构造函数希望将每个属性作为参数,因此构造函数最终将带有10个以上的参数。这将是丑陋的,并导致较长的,不可读的代码行。但是,优点是工厂可以解析JSON并使用正确的参数调用构造函数。产品类不需要知道由于JSON配置而已创建。不需要知道完全涉及JSON或配置。 2)产品的构造函数只需要一个参数property_tree对象。然后,它可以解析所需的信息。如果配置中的信息丢失或超出范围,则每个产品类别都可以正确响应。工厂不需要知道几种产品需要哪些参数。如果配置错误,工厂也不需要知道如何应对。而且构造函数的接口是统一的,很小的。但是,缺点是,该产品需要从JSON中提取所需的信息,因此,它知道如何构造它。 我倾向于选择解决方案2)。但是,我不确定这是否是好的工厂模式。让产品知道它是用JSON配置创建的,这感觉有点不对劲。另一方面,可以很简单地介绍新产品。 有什么意见吗?

2
写时复制语义的优点
我想知道写时复制有什么优点?当然,我并不期望个人观点,而是希望在实际操作中以切实可行的方式在技术上和实践中受益。实际上,我的意思不只是节省&字符输入。 要澄清的是,此问题是在数据类型的上下文中进行的,在赋值或副本构造中创建一个隐式浅表副本,但对其进行修改会创建一个隐式深表副本,并将更改应用于它而不是原始对象。 我问的原因是,我似乎没有发现将COW作为默认隐式行为的任何优点。我使用Qt,它为许多数据类型实现了COW,实际上所有数据类型都具有一些动态分配的底层存储。但是它如何真正使用户受益呢? 一个例子: QString s("some text"); QString s1 = s; // now both s and s1 internally use the same resource qDebug() << s1; // const operation, nothing changes s1[o] = z; // s1 "detaches" from s, allocates new storage and modifies first character // s is still "some …
10 c++  qt 

1
用于微控制器的RTOS的消息队列
我目前正在为微控制器编写RTOS。整个过程都是用C ++ 11编写的-如果有人感兴趣,则指向存储库的链接在底部。 当前,我正在编写一个类,该类是一个简单的数据队列,用于在线程之间(或在中断处理程序和线程之间或中断处理程序和其他中断处理程序之间)传递对象。通常,我尝试遵循在其他项目上找到的一些常见API,但是我没有找到具有emplace()功能并支持超时的并发队列的任何示例。 我一般的“问题”是我无法在这两个接口之间做出决定: (std::chrono::duration<Rep, Period>是模板化类型,为清晰起见,我省略了模板样板) 第一版: template<typename T> class FifoQueue { public: ... template<typename... Args> int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args); int tryPopFor(T&, std::chrono::duration<Rep, Period>); int tryPushFor(const T&, std::chrono::duration<Rep, Period>); int tryPushFor(T&&, std::chrono::duration<Rep, Period>); ... } 第二版: template<typename T> class FifoQueue { public: ... template<typename... Args> int tryEmplaceFor(std::chrono::duration<Rep, Period>, …

1
为什么GCC从Bison切换到C ++和C的递归下降解析器?
是否有需要的语言更改或某种实际的原因,使得Bison不再合适或不理想? 我在Wikipedia上看到它们切换了,参考了GCC 3.4和GCC 4.1发行说明。 这些发行说明指出: 手写递归下降C ++解析器已替换了以前的GCC版本中的YACC派生的C ++解析器。新的解析器包含改进的基础结构,这些基础结构可用于更好地解析C ++源代码,扩展的处理以及适当语义分析和解析之间的清晰分隔(如果可能)。新的解析器修复了旧解析器中发现的许多错误。 和: 旧的基于Bison的C和Objective-C解析器已被新的更快的手写递归下降解析器取代 我想知道的是他们遇到了什么实际问题,以及为什么使用Bison不可能/不切实际解决问题
10 c++  c  parsing  compiler 

5
是否存在技术限制或语言功能阻止我的Python脚本像等效的C ++程序一样快?
我是Python的长期用户。几年前,我开始学习C ++,以了解它在速度方面可以提供什么。在这段时间里,我将继续使用Python作为原型制作工具。看来,这是一个很好的系统:使用Python进行敏捷开发,在C ++中快速执行。 最近,我越来越多地使用Python,并学习如何避免早年使用该语言时很快使用的所有陷阱和反模式。据我了解,使用某些功能(列表理解,枚举等)可以提高性能。 但是,是否存在技术限制或语言功能使我的Python脚本无法与同等C ++程序一样快?

1
“ C ++模板:完整指南”(c)2002 —是C ++ 11的最新版本?
《C ++模板:完整指南》(c)2002 这本书对我来说似乎很有吸引力,但是由于它已经12岁了,我担心它可能已经过时了。一年前,有一些非常受好评的Amazon评论,而C ++模板上没有其他最新的标题。有谁知道2002年出版的关于模板的书(而不是专门关于STL的书)是否具有被C ++ 11取代或添加的语法或概念? 以下是来自Amazon的书籍描述: 模板是C ++最强大的功能之一,但是它们常常被忽视,误解和滥用。C ++模板:《完整指南》使软件架构师和工程师清楚了解为什么,何时以及如何使用模板来更高效地构建和维护更清洁,更快,更智能的软件。 C ++模板从关于基础概念和语言功能的有见地的教程开始。本书的其余部分可作为全面参考,首先关注语言细节,然后关注多种编码技术,最后关注模板的高级应用程序。本书中使用的示例说明了抽象概念并演示了最佳实践。 读者学习 模板的确切行为 如何避免与模板相关的陷阱 从基本到以前未记录的成语和技术 如何在不威胁性能或安全的情况下重用源代码 如何提高C ++程序的效率 如何生产更灵活和可维护的软件
10 c++  templates 

2
单元测试副作用繁重的代码
我开始写C ++代码来运行机器人,如果可以的话,我不知道如何合并单元测试。我提供了一个库,该库允许为机器人创建“命令”,这些命令会自动调度和执行。创建这些命令的机制是继承一个命令基类它们提供,并执行虚拟void Initialize(),void Execute()和void End()方法。这些功能纯粹是出于其副作用而运行,这些副作用会对机器人产生影响(运行电动机,伸出活塞等)。因此,除了模拟整个库之外,我几乎看不到任何将单元测试附加到代码的地方,这样我就可以检查机器人的虚拟前后状态。有没有一种方法可以对此进行单元测试,而不会造成太大的负担? 编辑 我想我可能对库的功能产生了误导。该库提供了机器人以及命令/调度系统的大部分接口,因此它不像模拟命令基类那么简单,我必须模拟整个硬件接口。不幸的是,我没有时间这样做。

7
我相信我应该混合使用C和C ++代码。这是一个问题,如何纠正?
背景/场景 我开始纯粹用C语言编写CLI应用程序(我的第一个适当的C或C ++程序不是“ Hello World”或其变体)。大约在中途,我正在处理用户输入(字符串数组)的“字符串”,然后发现了C ++字符串流对象。我看到我可以使用这些代码保存代码,因此我在应用程序中使用了它们。这意味着我已将文件扩展名更改为.cpp,现在使用g++而不是编译应用程序gcc。因此,基于此,我可以说该应用程序从技术上讲是一个C ++应用程序(尽管90%以上的代码是用我称为C的代码编写的,因为鉴于我有限的经验,这两种语言之间存在很多交叉之处他们俩)。它是一个大约900行长的.cpp文件。 重要因素 我希望该程序免费(如金钱形式),可以自由分发并可供所有人使用。我担心的是,有人会看一下代码,然后想出以下效果: 哦,看一下编码,太糟糕了,这个程序帮不了我 可能的话!另一个问题是代码高效(这是用于测试以太网连接性的程序)。代码中不应存在效率低下的部分,以至于它们可能严重阻碍应用程序或其输出的性能。但是,当寻求有关特定功能,方法,对象调用等的帮助时,我认为这是Stack Overflow的问题。 我的问题 (在我看来)混合了C和C ++,也许我不应该这样做。我应该用C ++重写所有内容(通过这种方式,我的意思是实现更多的C ++对象和方法,也许我已经用C风格编写了可以使用较新的C ++技术浓缩的内容),或者删除了使用字符串流对象和把这一切“带回” C代码?这里有正确的方法吗?我迷路了,需要一些指导如何使该应用程序在群众眼中保持“良好”,因此他们将使用它并从中受益。 代码-更新 这是代码的链接。大约有40%的评论,我几乎每行评论,直到我感到更加流利。在我链接到的副本中,我删除了几乎所有注释。我希望这不会使阅读变得困难。我希望没有人需要完全理解它。但是,如果我犯了致命的设计缺陷,我希望它们应该易于识别。我还应该提到,我正在编写几个Ubuntu台式机和笔记本电脑。我无意将代码移植到其他操作系统。
10 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.