Questions tagged «c++»

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

2
这是C ++中基于“ pImpl”的类层次结构的好方法吗?
我有一个我希望将接口与实现分开的类层次结构。我的解决方案是有两个层次结构:接口的句柄类层次结构和实现的非公共类层次结构。基本句柄类具有一个指向实现的指针,派生的句柄类将其强制转换为派生类型的指针(请参见function getPimpl())。 这是我对带有两个派生类的基类的解决方案的草图。有更好的解决方案吗? 文件“ Base.h”: #include <memory> class Base { protected: class Impl; std::shared_ptr<Impl> pImpl; Base(Impl* pImpl) : pImpl{pImpl} {}; ... }; class Derived_1 final : public Base { protected: class Impl; inline Derived_1* getPimpl() const noexcept { return reinterpret_cast<Impl*>(pImpl.get()); } public: Derived_1(...); void func_1(...) const; ... }; class Derived_2 …
9 design  c++  c++11 

1
将Redux中的原理应用于OO语言是否有意义?
Redux本质上是函数式编程,这很有意义。当我回到另一个项目中的非JavaScript OOP语言时,我想应用相同的原理,例如单个状态对象,作用于该状态部分的缩减器,用于修改状态的语义动作的业务层。 我的项目是C ++,我想知道尝试在设计应用程序中应用功能化,redux风格的方法是否有意义。对于这个应用程序,性能并不是至关重要,但是可维护性是至关重要的。 这样设计我的应用程序会遇到什么困难? 我应该补充一点,这不是GUI应用程序。再考虑一下,由于在应用程序状态更新中没有直接的视觉效果,因此redux在非GUI应用程序中的优势有所减少。

1
C语言中C ++模板类型API的惯用包装
我正在包装一个C ++ API,该API提供对C函数中的数据存储(Hazelcast)的访问,以便也可以从仅C代码中访问数据存储。 用于Map数据结构的Hazelcast C ++ API如下所示: auto map = hazelcastClient->client->getMap<int, string>(mapName); map.put(key, value); 它使用key和和的模板类型value。由于C中没有可用的模板,因此我考虑为该getMap<T, U>方法的每种特殊化创建包装函数。也就是说,对于每种C类型。虽然我知道有signed和unsignedC型的版本,我很好限制API仅支持int,double,float,char *为key和value。 所以我写了一个小脚本,可以自动生成所有组合。导出的函数如下所示: int Hazelcast_Map_put_int_string( Hazelcast_Client_t *hazelcastClient, const char *mapName, int key, char *value, char** errptr ); int Hazelcast_Map_put_int_int( Hazelcast_Client_t *hazelcastClient, const char *mapName, int key, int value, char** errptr ); ... 生成功能get,set,contains与所有可能的组合key和value种类增加了代码的数量相当多,虽然我觉得生成的代码是一个好主意,它具有创造某种代码生成的基础设施增加了额外的复杂性。 我可以想象的另一个想法是C中的一个泛型函数,如下所示: int …
9 c++  c  api-design 


5
声明一个volatile变量是什么意思?
许多低级程序使用volatile关键字来进行内存映射的类型等,但是我对其在后台真正执行操作感到困惑。换句话说,当编译器没有“优化”内存地址时,这意味着什么?
9 c++  c  low-level 

2
接口隔离原理:如果接口存在大量重叠该怎么办?
摘自敏捷软件开发,原理,模式和实践:Pearson新国际版: 有时,由不同客户端组调用的方法会重叠。如果重叠很小,则组的接口应保持分离。公用功能应在所有重叠的接口中声明。服务器类将从每个接口继承通用功能,但仅实现一次。 鲍伯叔叔,谈论有微小重叠的情况。 如果出现大量重叠该怎么办? 说我们有 Class UiInterface1; Class UiInterface2; Class UiInterface3; Class UiIterface : public UiInterface1, public UiInterface2, public UiInterface3{}; 如果UiInterface1和之间有大量重叠,该UiInterface2怎么办?

1
C ++序列化设计评论
我正在编写一个C ++应用程序。大多数应用程序都需要读写数据引用,这一点也不例外。我为数据模型和序列化逻辑创建了一个高级设计。这个问题要求考虑以下特定目标对我的设计进行审查: 以一种简单灵活的方式来读取和写入任意格式的数据模型:原始二进制,XML,JSON等。等 数据格式应与数据本身以及请求序列化的代码分离。 为了确保序列化尽可能地没有错误。I / O具有多种固有的风险:我的设计是否引入了更多的失败方法?如果是这样,我如何重构设计以减轻这些风险? 该项目使用C ++。无论您是喜欢还是讨厌它,语言都有其自己的处理方式,并且设计旨在与该语言一起工作,而不是反对它。 最后,该项目基于wxWidgets构建。当我在寻找适用于更一般情况的解决方案时,此特定实现应与该工具箱配合良好。 接下来是用C ++编写的一组非常简单的类,它们说明了设计。这些不是我到目前为止已经部分编写的实际类,此代码仅说明了我正在使用的设计。 首先,一些示例DAO: #include <iostream> #include <map> #include <memory> #include <string> #include <vector> // One widget represents one record in the application. class Widget { public: using id_type = int; private: id_type id; }; // Container for widgets. Much more …
9 design  c++  c++11 

1
密钥/价值商店开发移植到现代C ++
我正在开发类似于Cassandra的数据库服务器。 开发从C语言开始,但是没有类,事情变得非常复杂。 目前,我在C ++ 11中移植了所有内容,但我仍在学习“现代” C ++,并对很多事情有疑问。 数据库将使用键/值对。每对都有更多信息-什么时候创建以及何时过期(如果不过期则为0)。每对都是不可变的。 关键是C字符串,值是空*,但至少目前我也使用C字符串作为值。 有抽象IList类。它从三个类继承 VectorList -C动态数组-类似于std :: vector,但使用 realloc LinkList -用于检查和性能比较 SkipList -最终将使用的类。 将来我可能Red Black也会做树。 每个都IList包含零个或多个指向对的指针,并按键排序。 如果IList太长,可以将其保存在磁盘上的特殊文件中。这个特殊文件是的read only list。 如果您需要搜索密钥, 首先在存储器IList中搜索(SkipList,SkipList或LinkList)。 然后将搜索发送到按日期排序的文件 (最新的文件在前,最早的文件在后)。 所有这些文件都在内存中映射。 如果未找到任何内容,则找不到密钥。 我对事情的执行毫无疑问IList。 目前令人困惑的是: 这些对的大小不同,它们由分配,new()并已std::shared_ptr指向它们。 class Pair{ public: // several methods... private: struct Blob; std::shared_ptr<const Blob> _blob; }; struct Pair::Blob{ uint64_t …

4
rand()在小范围内再次给出相同的数字
我正在尝试制作一种游戏,其中有20x20的网格,并显示一个玩家(P),一个目标(T)和三个敌人(X)。所有这些都有一个X和Y坐标,使用分配rand()。问题是,如果我尝试在游戏中获得更多积分(补充能量等),则它们会与一个或多个其他积分重叠,因为范围很小(包括1到20)。 这些是我的变量以及如何为它们分配值:(COORD是一个struct只有X和Y的a) const int gridSize = 20; COORD player; COORD target; COORD enemy1; COORD enemy2; COORD enemy3; //generate player srand ( time ( NULL ) ); spawn(&player); //generate target spawn(&target); //generate enemies spawn(&enemy1); spawn(&enemy2); spawn(&enemy3); void spawn(COORD *point) { //allot X and Y coordinate to a point point->X = randNum(); …
9 c++  random 

4
如何在不强制进行层次结构的情况下使对象彼此交互和通信?
我希望这些问题能使我的问题更清楚-但是,我完全理解它们是否愿意,所以请让我知道是否是这种情况,然后我将尝试使自己更加清楚。 认识BoxPong,这是我做的非常简单的游戏,以熟悉面向对象的游戏开发。拖动框以控制球并收集黄色的东西。 制作BoxPong可以帮助我提出一个基本问题:除其他事项外,我如何才能具有相互交互的对象?换句话说,有没有一种方法使对象不是分层的而是共存的?(我将在下面进一步详细介绍。) 我怀疑对象共存的问题是一个普遍的问题,因此我希望有一个既定的解决方法。我不想重新发明方形齿轮,因此我想寻找的理想答案是“这是一种通常用于解决您的问题的设计模式”。 尤其是在像BoxPong这样的简单游戏中,很明显,在同一级别上存在或应该存在少量对象。有一个盒子,有一个球,有一个收藏品。我可以用面向对象的语言表达的所有内容,尽管看起来似乎都是严格的HAS-A关系。这是通过成员变量完成的。我不能只是开始ball并让它做它的事情,我需要它永久地属于另一个对象。我已经设定,使游戏的主要对象有一个箱子,并依次盒子有一个球,并有一个比分反超。每个对象也都有一个update()方法,该方法计算位置,方向等,我走了类似的方法还有:我所说的主要游戏对象的更新方法,它调用了所有儿童的更新方法,它们依次调用所有的更新方法他们的孩子。这是我看到的制作面向对象游戏的唯一方法,但我认为这不是理想的方法。毕竟,我不会完全把球看作是属于盒子的东西,而是要处于同一水平并与之交互。我想可以通过将所有游戏对象都转换成主要游戏对象的成员变量来实现,但是我看不出有什么解决方法。我的意思是……撇开明显的混乱,如何让球和盒子互相认识,也就是互动? 还存在对象之间需要传递信息的问题。我有很多为SNES编写代码的经验,您几乎一直可以访问整个RAM。假设您要为Super Mario World定制敌人,并且希望它删除Mario的所有硬币,然后只存储零以解决$ 0DBF,这没问题。没有任何限制说敌人无法访问玩家的状态。我想我被这种自由宠坏了,因为对于C ++之类的东西,我经常发现自己在想如何使其他对象(甚至全局对象)可以访问值。 以BoxPong为例,如果我希望球从屏幕边缘弹起怎么办?width和height是的属性Game类,ball可以访问它们。我可以传递这些类型的值(通过构造函数或需要它们的方法),但是这只是对我的不好的做法。 我想我的主要问题是我需要对象彼此了解,但是我看到的唯一方法是严格的层次结构,这是丑陋且不切实际的。 我听说过C ++上的“朋友类”,并且知道它们是如何工作的,但是如果它们是最终解决方案,那么为什么我看不到friend每个C ++项目中都充斥着关键字呢?并不是每种OOP语言都存在这个概念吗?(我最近才了解到的函数指针也是如此。) 预先感谢您提供任何形式的答案-再次提醒您,如果有部分内容对您没有意义,请告诉我。

2
设计异常类
我正在编写一个小型库,在设计异常处理时遇到了一些麻烦。我必须说,我(仍然)对C ++语言的此功能感到困惑,并且我尝试尽可能多地阅读该主题,以了解如何正确使用异常类将要做什么。 我决定使用一种system_error方法,该方法从future_error该类的STL实现中获得启发。 我有一个包含错误代码的枚举: enum class my_errc : int { error_x = 100, error_z = 101, error_y = 102 }; 和一个异常类(由error_category结构类型和system_error模型所需的所有其他内容支持): // error category implementation class my_error_category_impl : public std::error_category { const char* name () const noexcept override { return "my_lib"; } std::string message (int ec) const override { std::string …

7
精通C ++的知识是否可以帮助您更快/更轻松地学习其他语言?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 学习过C ++所有关键方面并且非常了解该语言基础知识的人是否有可能更快,更轻松地学习其他语言(例如Python,Perl,Java)?
9 c++ 

5
服务器终止时正确处置对象
我正在从事大型C ++项目。它由公开REST API的服务器组成,为包含许多其他服务器的非常广泛的系统提供了一个简单且用户友好的界面。该代码库很大且很复杂,并且随着时间的流逝而没有适当的设计前期。我的任务是实现新功能并重构/修复旧代码,以使其更稳定,更可靠。 目前,服务器创建了多个长寿命对象,这些对象在进程终止时不会终止或处置。这使得Valgrind几乎无法用于泄漏检测,因为不可能区分成千上万(合法地)合法泄漏与“危险”泄漏。 我的想法是确保在终止之前将所有对象都处置掉,但是当我提出此建议时,我的同事和老板反对我指出操作系统将以任何方式释放内存(这对每个人都是显而易见的)并处置对象将减慢服务器的关闭速度(目前基本上是对的调用std::exit)。我回答说,拥有一个“干净的”关闭程序并不一定意味着必须使用它。如果我们感到不耐烦,我们可以随时致电,也可以std::quick_exit只是kill -9这个过程。 他们回答说:“大多数Linux守护程序和进程都不会在关闭时释放内存”。虽然我可以看到,但确实我们的项目确实需要准确的内存调试,因为我已经发现内存损坏,双重释放和未初始化的变量。 你怎么看?我在追求无意义的努力吗?如果没有,我该如何说服我的同事和老板?如果是这样,为什么,我应该怎么做?
9 c++  debugging  memory 

6
拆分大型接口
我正在使用一个带有大约50种方法的大型接口来访问数据库。该界面是由我的一位同事编写的。我们讨论了这一点: 我:50种方法太多了。这是代码气味。 同事:我该怎么办?您需要数据库访问权限-您拥有它。 我:是的,但是目前还不清楚,将来很难维护。 同事:好的,您是对的,不好。界面应该如何? 我:有5种方法返回的对象各有10种方法怎么样? 嗯,但这不一样吗?这真的会导致更加清晰吗?值得付出努力吗? 我时不时地处于需要界面的情况,而想到的第一件事就是一个大型界面。是否有通用的设计模式? 更新(响应SJuan的评论): “种类的方法”:它是用于从数据库中获取数据的接口。所有方法都具有形式(伪代码) List<Typename> createTablenameList() 方法和表并不完全是1-1关系,而是更多地关注您总是从数据库中获得某种列表的事实。

1
通过LLVM从C ++应用程序移植到Java是否可行
使用LLVM(我猜是LLJVM)将C ++应用程序移植到Java字节码的可行性如何? 事实是,我们目前有一个用C ++编写的过程,但是新的客户端已经强制要求能够使用显然没有任何本地代码(没有JNI)的Java虚拟机以多平台方式运行该程序。这个想法是要能够将生成的jar并复制然后复制到不同的系统(Linux,Win,32位-64位),它应该可以正常工作。 环顾四周似乎可以将C ++编译为LLVM IR代码,然后将该代码编译为Java字节码。不需要所生成的代码是可读的。 我已经使用emscripten对类似的东西进行了一些测试,这需要C ++代码并将其编译为JavaScript。结果是有效的JS,但完全不可读(看起来像assambler)。 是否有人使用此技术将应用程序从C ++移植到Java字节码? 我们可能面对什么问题? 生产代码是否有效? 在发表一些评论后,为了更清楚地表明我的观点,也许端口没有被很好地使用,因此我不希望可读的源代码只是Java字节码,因此它不再是将要开发的“端口”,只是目标平台必须是Java JVM,而不是本机。 注意:我知道目前我们有一些非标准C ++和关闭源代码库,我们正在寻求删除此非标准代码和所有关闭源代码库,并使用Free Libre开源软件,因此,假设所有代码均为标准C ++代码,所有代码在编译时可用。 注意2:不能编写可移植的C ++代码然后将其编译到所需的目标平台,因为编译后的程序必须是多平台的,因此要使用JVM。 注意3:现在我们不在研究适用于Python或其他语言库的类似解决方案,但我也想听听它。我的意思是我们的目标可执行文件必须是java字节码,但是如果有一些选项可以将C ++编译为有效的python编译代码,我也想听听它们。
9 java  c++  porting 

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.