标签: c++

C++类接口类的析构函数

开始在现有代码库上使用PC-Lint(恐惧和恐惧).

它抱怨的一件事是:

 class IBatch
 {
 public:
    virtual void StartBatch() =0;
    virtual int CommitBatch() =0;
 };
Run Code Online (Sandbox Code Playgroud)

当另一个类派生出来时,它就像一个接口一样使用它

base class 'IBatch' has no destructor
Run Code Online (Sandbox Code Playgroud)

所以,问题是:当您创建如上所述的接口类时,您是否始终包含虚拟析构函数?为什么?(是样式还是编码错误?)

编辑:应该说我不希望或希望IBatch 的用户破坏,他们只是一个服务的消费者,通过这个接口到一些外部实现类(如果这会有所作为)

c++

24
推荐指数
4
解决办法
9703
查看次数

需要C++ R - tree实现

有没有人知道在生产代码R-tree实现中使用的好和简单?(实际上,任何实现 - R*, R+或者PR-tree会很棒)

它是一个模板或库实现无关紧要,但谷歌发现的一些实现看起来非常令人失望......

c++ r-tree

24
推荐指数
4
解决办法
2万
查看次数

未定义的行为值得吗?

由于未定义的行为,许多不好的事情发生并且继续发生(或者不知道,谁知道,任何事情都可能发生).据我所知,这是为了让编译器进行优化留下一些摆动空间,也可能使C++更容易移植到不同的平台和架构.然而,由未定义的行为引起的问题似乎太大而无法通过这些论证来证明.未定义行为的其他参数是什么?如果没有,为什么还存在未定义的行为?

编辑为我的问题添加一些动机:由于使用较少C++的几个糟糕经历 - 狡猾的同事,我已经习惯了使我的代码尽可能安全.断言每一个论点,严谨的正确性以及类似的东西.我试图离开,因为小房间可能以错误的方式使用我的代码,因为经验表明,如果有漏洞,人们会使用它们,然后他们会打电话给我,说我的代码很糟糕.我认为让我的代码尽可能安全是一种好的做法.这就是为什么我不明白为什么存在未定义的行为.有人可以给我一个未定义行为的例子,这些行为在运行时或编译时无法检测到而没有相当大的开销吗?

c++ undefined-behavior

24
推荐指数
4
解决办法
1967
查看次数

如何选择整数线性编程求解器?

我是整数线性编程的新手.我计划使用整数线性编程求解器来解决我的组合优化问题.我更熟悉IDE上的C++ /面向对象编程.现在我使用NetBeans和Cygwin一起编写我的应用程序.

我可以问一下,对我来说是否有一个简单易用的ILP求解器?或者这取决于我想解决的问题?我正在尝试做一些资源映射优化.如果需要任何进一步的信息,请告诉我.

非常感谢,Cassie.

c++ algorithm linear-programming genetic-algorithm graph-algorithm

24
推荐指数
4
解决办法
2万
查看次数

在参考C++中存储函数的返回值

将对象的返回值存储在引用中是否有效?

class A { ... };
A myFunction()
{
    A myObject;
    return myObject;
} //myObject goes out of scope here

void mySecondFunction()
{
    A& mySecondObject = myFunction();
}
Run Code Online (Sandbox Code Playgroud)

是否可以这样做以避免将myObject复制到mySecondObject?不再需要myObject,它应该与mySecondObject完全相同,所以理论上将对象的所有权从一个对象传递到另一个对象会更快.(这也可以使用boost共享指针,但是它具有共享指针的开销.)

提前致谢.

c++ reference return-value

24
推荐指数
3
解决办法
1万
查看次数

在游戏编程中全局变量不好吗?

我知道我对全局变量的直觉反应是"糟糕的!" 但是在我的大学全球比赛中使用的两个游戏开发课程被广泛使用,现在我正在使用的DirectX 9游戏编程教程(www.directxtutorial.com)我被告知全局游戏编程是可以的. ..?该网站还建议仅使用结构,如果您可以在进行游戏编程时帮助保持简单.

我在这个问题上真的很困惑,我一直在努力做的所有研究都很混乱.我意识到使用全局变量存在问题(线程问题,它们使代码难以维护,它们的状态难以跟踪等)但是还有与不使用全局变量相关的成本,我必须通过一个loooot虽然我觉得指针会加快这个过程(这是我第一次用C++编写游戏.)无论如何,我意识到可能没有"正确"或"错误"的答案在这里,因为两种方式都有效,但我希望我的代码尽可能正确,所以任何输入都会很好,非常感谢你!

c++ global-variables

24
推荐指数
4
解决办法
8256
查看次数

取消引用空指针

int* p = 0;
int* q = &*p;
Run Code Online (Sandbox Code Playgroud)

这是未定义的行为吗?我浏览了一些相关问题,但这个具体方面没有显示出来.

c c++ null pointers

24
推荐指数
1
解决办法
2584
查看次数

带有Boost的D_WIN32_WINNT编译器警告

不知道该怎么做这个错误.添加-D_WIN32_WINNT=0x0501到项目属性下的Visual Studio的"命令行"选项,但它表示它无法识别它并且警告仍然出现.

我也不确定如何添加预处理器定义.

1>请正确定义_WIN32_WINNT或_WIN32_WINDOWS.例如:
1> - 将-D_WIN32_WINNT = 0x0501添加到编译器命令行; 或
1> - 将_WIN32_WINNT = 0x0501添加到项目的预处理器定义中.

c++ boost boost-preprocessor

24
推荐指数
3
解决办法
2万
查看次数

除以零:未定义的行为或实现在C和/或C++中定义?

关于除零,标准说:

C99 6.5.5p5 - /运算符的结果是第一个操作数除以第二个操作数的商; %运算符的结果是余数.在这两个操作中,如果第二个操作数的值为零,则行为未定义.

C++ 03 5.6.4 - 二进制/运算符产生商,二进制%运算符从第一个表达式除以第二个表达式得到余数.如果/或%的第二个操作数为零,则行为未定义.

如果我们将上述段落视为面值,答案显然是两种语言的未定义行为.但是,如果我们进一步了解C99标准,我们会看到以下段落似乎是矛盾的(1):

C99 7.12p4 - 宏INFINITY扩展为float类型的常量表达式,表示正无穷大或无符号无穷大(如果可用);

标准是否有某种黄金法则,其中未定义的行为不能被(可能)矛盾的陈述所取代?除此之外,我认为如果你的实现定义了INFINITY宏,那么将零除法定义为这样是不合理的.但是,如果您的实现没有定义这样的宏,则行为是Undefined.

我很好奇这两种语言在这个问题上的共识是什么(如果有的话).如果我们谈论整数除法int i = 1 / 0与浮点除法,答案会改变float i = 1.0 / 0.0吗?

注意(1) C++ 03标准讨论了<cmath>包含INFINITY宏的库.

c c++ divide-by-zero undefined-behavior

24
推荐指数
3
解决办法
2万
查看次数

GCC建议和最快代码选项

我正在分发一个带有Unix版本的makefile的C++程序,我想知道我应该使用哪些编译器选项来获得最快的代码(它属于可以使用它们可以获得的所有计算能力的程序类别鉴于我事先并不知道用户将拥有什么硬件,操作系统或gcc版本,并且我最重要的是要确保它至少在每个主要类Unix上都能正常运行操作系统.

到目前为止,我有,我g++ -O3 -Wno-write-strings还有其他选择吗?在Windows上,Microsoft编译器可以选择快速调用约定和链接时间代码生成等值得使用的选项,gcc上有没有等价物?

(我假设它在64位平台上默认为64位,如果不是这样,请纠正我.)

c++ unix gcc

24
推荐指数
6
解决办法
3万
查看次数