Questions tagged «c++»

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

2
单一责任和自定义数据类型
在过去的几个月中,我一直要求SE和其他网站上的人员给我一些有关我的代码的建设性批评。一件事几乎每次都会弹出,我仍然不同意这个建议。:P我想在这里讨论它,也许事情对我来说会变得更加清楚。 它与单一责任原则(SRP)有关。基本上,我有一个数据类,Font它不仅包含用于处理数据的函数,而且还用于加载数据。有人告诉我这两个应该分开,加载函数应该放在工厂类中。我认为这是对SRP的误解。 我字体类的片段 class Font { public: bool isLoaded() const; void loadFromFile(const std::string& file); void loadFromMemory(const void* buffer, std::size_t size); void free(); void some(); void another(); }; 建议设计 class Font { public: void some(); void another(); }; class FontFactory { public: virtual std::unique_ptr<Font> createFromFile(...) = 0; virtual std::unique_ptr<Font> createFromMemory(...) = …

5
代码文档:公共与非公共?
我就是那些思维定式的人,他们所写的代码应该是不言自明的,并且应该像书一样阅读。 但是,在开发供他人使用的库代码时,我尝试将尽可能多的文档放在头文件中;这就提出了一个问题:非公开的记录方法是否值得?他们不会直接使用它们,实际上,它们不能。同时,如果我分发原始代码(尽管很不情愿),那些非公共方法将是可见的,可能需要解释。 只是寻找您在旅途中看到或使用的一些标准和做法。

3
是否正在逐步淘汰Objective-C ++?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 苹果是否正在逐步淘汰对Objective-C ++的支持?请注意以下几点: 在Objective-C语言手册中,曾经有一节介绍了Objective-c和c ++的混合。该部分现在丢失了。 链接在苹果开发者网站上的Objective-C ++文章似乎被打破,现在又重新定向,比如这一次,我就发现了这个问题计算器。 在apple dev网站上搜索c ++不会带来当前信息。 我应该担心使用c ++进行iOS开发吗?
10 c++  objective-c  apple 

10
比手写循环更喜欢算法?
您对以下哪项更具可读性?手写循环: for (std::vector<Foo>::const_iterator it = vec.begin(); it != vec.end(); ++it) { bar.process(*it); } 或算法调用: #include <algorithm> #include <functional> std::for_each(vec.begin(), vec.end(), std::bind1st(std::mem_fun_ref(&Bar::process), bar)); 我想知道是否std::for_each真的值得,因为这样一个简单的示例已经需要大量的代码。 您对此事有何看法?
10 c++  algorithms 


4
C ++处理大型模板实现的首选方法
通常,在声明C ++类时,最佳实践是仅将声明放入头文件中,并将实现放入源文件中。但是,这种设计模型似乎不适用于模板类。 在网上查找时,对于管理模板类的最佳方法似乎有两种意见: 1.标头中的整个声明和实现。 这相当简单,但是我认为,当模板变大时,很难维护和编辑代码文件。 2.将实现写入末尾包含的模板包含文件(.tpp)中。 对我来说,这似乎是一个更好的解决方案,但似乎并未得到广泛应用。是否存在这种方法不及格的原因? 我知道很多时候,代码风格是由个人喜好或传统风格决定的。我正在开始一个新项目(将旧的C项目移植到C ++),并且我对OO设计比较陌生,并且希望从一开始就遵循最佳实践。

3
如何设计一个C ++程序以允许在运行时导入功能?
今天,我想问您一个有关C ++实现特定软件体系结构功能的问题。 当然,我使用了搜索但是没有找到任何直接链接的答案。 基本上,我的目标是建立一个程序,使用户可以对任意组成的物理系统(例如驾驶汽车)进行建模和仿真。我假设有一个物理模型库(类中的函数)。每个函数可以具有一些输入,并根据基础的物理描述返回一些输出,例如,内燃机模型,空气阻力模型,车轮模型等。 现在,该想法是为用户提供一个框架,该框架允许他根据自己的需求来组合任何功能,即映射任何身体行为。该框架应提供功能,以连接不同功能的输出和输入。因此,该框架提供了一个容器类。我称它为COMPONENT,它可以容纳一个或多个模型对象(FUNCTION)。这些容器还可以容纳其他组件(参见复合模式)以及功能参数之间的连接(CONNECTOR)。此外,组件类提供了一些通用的数字功能,例如数学求解器等。 功能的组合应在运行时完成。在第一个实例中,用户应该能够通过导入定义合成结构的XML来建立合成。后来,人们可能会想到添加GUI。 为了使您更好地理解,这里是一个非常简化的示例: <COMPONENT name="Main"> <COMPONENT name="A"> <FUNCTION name="A1" path="lib/functionA1" /> </COMPONENT> <COMPONENT name="B"> <FUNCTION name="B1" path="lib/functionB1" /> <FUNCTION name="B2" path="lib/functionB2" /> </COMPONENT> <CONNECTIONS> <CONNECTOR source="A1" target="B1" /> <CONNECTOR source="B1" target="B2" /> </CONNECTIONS> </COMPONENT> 不必要深入研究框架的功能,因为我的问题更为普遍。编译框架代码/程序时,物理问题描述以及用户定义的功能未知。当用户选择功能(通过XML或以后通过GUI)时,框架应读取功能信息,即应获取输入和输出参数的信息,以便为用户提供互连功能的选项。 我知道反射的原理,并且我知道C ++不提供此功能。但是,我确信经常需要“在运行时构建对象”的概念。我应该如何在C ++中设置软件体系结构以实现我的目标?C ++是正确的语言吗?我忽略了什么? 提前致谢! 干杯,奥利弗

2
因为GCC是用C ++本身编写的,所以没有鸡和蛋的问题吗?
从4.8版本开始,C ++编译器GCC(它的G ++部分)不再用C编写,而是用C ++本身编写。我对此有一个假设的问题。 我想知道如何在还没有C ++编译器的新平台上编译GCC的C ++代码。当然,您可以使用在其他计算机上编译的预构建二进制文件。或者,您可以使用用C编写的旧版GCC,然后使用它编译当前版本。 但是,如果没有预构建的二进制文件,而只有最新版本,您就会陷入困境,对吗?如果没有,那么从GCC项目的C转换为C ++会对这种情况产生其他影响吗?
10 c++  compiler  gcc 

3
C ++:使用编译器API而不是C ++功能进行元编程
这最初是一个SO问题,但我意识到这是非常不合常规的,并且根据网站上的实际描述,它可能更适合程序员。因为该问题在概念上具有很大的分量。 我一直在学习clang LibTooling,它是一个非常强大的工具,能够以友好的方式(即以语义的方式,而不是通过猜测)公开代码的整个“坚韧不拔” 。如果clang可以编译您的代码,则clang 可以确定该代码内每个字符的语义。 现在让我退一步。 当人们从事C ++模板元编程时(特别是当冒险超越模板进入聪明的领域,尽管使人恐惧)时,会出现许多实际问题。老实说,对于包括我自己在内的许多程序员而言,模板的许多常规用法也有些令人恐惧。 我想一个很好的例子就是编译时字符串。这是一个已经存在一年多的问题了,但是很显然,到目前为止,C ++对于普通人来说并不容易。尽管看这些选项还不足以引起我的恶心,但我仍然对能够产生神奇的,最高效率的机器代码以适应我的软件中任何花哨的应用程序没有信心。 我的意思是,让我们面对现实吧,伙计们,琴弦非常简单和基本。我们中的某些人只是想要一种便捷的方法来发出带有某些字符串的机器代码,而这些字符串在某些情况下“嵌入”了比直接编写代码时要多得多。在我们的C ++代码中。 输入clang和LibTooling,这将公开源代码的抽象语法树(AST),并允许简单的自定义C ++应用程序正确正确地操作原始源代码(使用Rewriter)以及AST中所有对象的丰富的面向对象的语义模型。它处理很多事情。它了解宏扩展,并让您遵循这些链。是的,我说的是源代码到源代码的转换或翻译。 我在这里的基本论点是,使用clang,现在我们可以创建可执行文件,这些可执行文件本身可以用作C ++软件的理想自定义预处理程序阶段,并且可以使用C ++实现这些元编程阶段。我们仅受以下事实的约束:该阶段必须接受有效的C ++代码的输入,并产生更多有效的C ++代码作为输出。加上您的构建系统适用的任何其他限制。 输入至少必须非常接近有效的C ++代码,因为毕竟clang是编译器的前端,而我们只是在四处寻找并利用其API发挥创意。我不知道是否有任何规定可以定义要使用的新语法,但是显然我们必须开发一种方法来正确解析它并将其添加到clang项目中。期望更多的是在clang项目中超出范围。 没问题 我可以想象一些无操作宏函数可以处理此任务。 查看我正在描述的另一种方法是通过运行我们的源代码的AST(感谢clang及其API)来使用运行时C ++实现元编程构造,而不是使用语言本身可用的更有限的工具来实现它们。这也具有明显的编译性能优势(繁重的模板头与您使用它们的频率成比例地减慢了编译速度。然后,许多已编译的东西被链接器仔细地匹配并丢弃了)。 但是,这样做的代价是在构建过程中引入了额外的一两个步骤,并且还要求(当然)编写一些更详细的软件(但至少是简单的运行时C ++)作为我们工具的一部分。 那不是全部。我非常确定,生成核心语言功能极其困难或不可能的代码可以提供更大的功能空间。在C ++中,您可以编写模板,宏或两者的疯狂组合,但是在clang工具中,您可以在运行时以C ++可以实现的任何方式修改类和函数,同时可以完全访问语义内容,除了模板和宏以及其他所有内容。 因此,我想知道为什么每个人都还没有这样做。是不是来自clang的此功能如此新,并且没人熟悉clang的AST的巨大类层次结构?那不可能。 也许我只是低估了这一点的难度,但是使用clang工具执行“编译时字符串操作”几乎在犯罪上很简单。它很冗长,但是非常简单。所需要的只是一堆无操作宏函数,它们映射到实际的实际std::string操作。clang插件通过获取所有相关的无操作宏调用来实现此目的,并使用字符串执行操作。然后将该工具作为构建过程的一部分插入。在构建过程中,这些无操作宏函数调用会自动评估为其结果,然后作为纯旧的编译时字符串插入到程序中。然后可以照常编译该程序。实际上,结果是该程序的移植性也大大提高,不需要新的支持C ++ 11的编译器。

4
允许库分离的多态行为设计模式
假设我有一个Item类的层次结构:Rectangle, Circle, Triangle。我希望能够绘制它们,所以我的第一种可能是Draw()向每个虚拟方法添加一个虚拟方法: class Item { public: virtual ~Item(); virtual void Draw() =0; }; 但是,我想将绘图功能拆分到单独的Draw库中,而Core库仅包含基本表示形式。我可以想到几种可能性: 1-A DrawManager接受Items 的列表,必须使用它dynamic_cast<>来确定要做什么: class DrawManager { void draw(ItemList& items) { FOREACH(Item* item, items) { if (dynamic_cast<Rectangle*>(item)) { drawRectangle(); } else if (dynamic_cast<Circle*>(item)) { drawCircle(); } .... } } }; 这不是理想的选择,因为它依赖于RTTI并迫使一个类了解层次结构中的所有项。 2-另一种方法是将绘图责任推迟到一个ItemDrawer层次结构(RectangleDrawer,等): class Item { virtual …

3
我应该如何封装数据库访问权限?
有哪些用于管理数据库访问的良好类结构的示例?我是类封装的迷,并且希望容器(例如car)不执行数据库任务。 我还希望将来能够轻松放入数据库缓存之类的功能。 我经常采用容器类的模式,并结合使用getter和setter来进行验证和由单个singleton类执行的数据库访问。话虽这么说,这常常在两者之间混在一起并且变得非常混乱。 对不起,如果我的问题很难理解;我对数据库的术语不是绝对确定。如果需要,请随时要求澄清。
10 c++  database 

3
抽象基类和副本构造,经验法则
通常,最好有一个抽象基类来隔离对象的接口。 问题在于,默认情况下,C ++中的副本构造IMHO在很大程度上已被破坏,默认情况下会生成副本构造函数。 那么,当您有一个抽象基类和派生类中的原始指针时,会遇到什么陷阱? class IAbstract { ~IAbstract() = 0; } class Derived : public IAbstract { char *theProblem; ... } IAbstract *a1 = new Derived(); IAbstract a2 = *a1;//??? 现在,您是否彻底禁用了整个层次结构的副本构建?将副本构造声明为私有IAbstract? 抽象基类是否有三分法则?

9
棋类的继承与组成
快速搜索此堆栈交换显示,通常认为合成比继承更灵活,但与往常一样,它取决于项目等,并且有时继承是更好的选择。我想制作一个3D象棋游戏,其中每个棋子都有一个网格,可能有不同的动画等等。在这个具体的例子中,似乎您可以为两种方法都辩护,我错了吗? 继承看起来像这样(使用适当的构造函数等) class BasePiece { virtual Squares GetValidMoveSquares() = 0; Mesh* mesh; // Other fields } class Pawn : public BasePiece { Squares GetValidMoveSquares() override; } 当然遵循“是”原则,而构图看起来像这样 class MovementComponent { virtual Squares GetValidMoveSquares() = 0; } class PawnMovementComponent { Squares GetValidMoveSquares() override; } enum class Type { PAWN, BISHOP, //etc …

2
正确的设计可以避免使用dynamic_cast?
经过一些研究,我似乎找不到一个简单的例子来解决我经常遇到的问题。 假设我要创建一个小应用程序,可以在其中创建Squares,Circles和其他形状,将它们显示在屏幕上,在选择它们后修改其属性,然后计算其所有周长。 我会像这样做模型类: class AbstractShape { public : typedef enum{ SQUARE = 0, CIRCLE, } SHAPE_TYPE; AbstractShape(SHAPE_TYPE type):m_type(type){} virtual ~AbstractShape(); virtual float computePerimeter() const = 0; SHAPE_TYPE getType() const{return m_type;} protected : const SHAPE_TYPE m_type; }; class Square : public AbstractShape { public: Square():AbstractShape(SQUARE){} ~Square(); void setWidth(float w){m_width = w;} …

3
如何将软件修改为实时?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 3年前关闭。 首先,我想提到我是实时系统编程的新手,这就是为什么我不确定我的问题是否正确的原因。抱歉,我需要一些帮助 简而言之,问题是: 如何实施硬实时软件以确保其在硬期限内完成?是否有必要使用某些QNX功能?还是足以为Linux编写它,移植到QNX并默认为实时? 完整问题: 我们已经针对Linux,Windows,Android和QNX实现了一些具有进程间通信的复杂跨平台多进程软件。编程语言是C ++,我们使用Boost和其他库的planty。我们的软件可以很好且快速地完成工作,但它仍是原型。出于生产目的,我们需要实时进行操作,因为某些功能非常重要,因此某些功能必须实时且非常可靠,并且使用我们软件的人员的安全性可能取决于这些功能。它们的工作速度非常快-高达数百毫秒。但是由于这个事实,我不确定我们的系统是否是实时的(我对吗?)。 因此,存在一个主要问题:如何将我们的软件修改为实时的?我已经用谷歌搜索了很多,但是我仍然不知道该怎么做。 有关平台的一些其他信息:Linux和Windows,我们目前仅用于测试目的。Android-我们仍未决定是否需要它。QNX-是我们生产的目标操作系统。我想我的下一个问题的答案是“否” :)但是,是否有可能实施跨平台的实时软件(用于实时OS(RTOS)以及用于通用OS(GPOS))? 可能我们需要努力只为QNX实施所有实时功能吗?但是我还是不知道该怎么做。有人可以阐明这个问题吗?
9 c++  real-time 

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.