问题标签 [c++98]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
228 浏览

c++ - 使用 ={} 语法初始化结构时,幕后发生了什么?

根据评论稍微编辑调整示例

一些代码然后是问题(只是为了澄清,这是一个 C++ 问题):

这里有几个问题:

  1. 发生了什么神奇的事情,允许MyStruct1以这种方式初始化的实例
  2. 在 c++98 中有解决方法吗?

作为参考,我试图使用构造函数作为强制堆栈分配的结构为零初始化的一种方式,但我不想禁止这种初始化方式。

0 投票
1 回答
218 浏览

c++ - 这种模式在 C++ 中有效吗?

我正在我的项目上运行 PREfast 静态代码分析,它给了我 C6001 'using uninitialized memory' 这种模式的错误:

我试图利用的技巧是允许 select_image 的范围仅限于 if 表达式(即 if (condition) { expression-block = 条件变量的生命周期}。

VS 已经愉快地编译(并且可能会运行它)很长一段时间了。我已经很久没有这样的单步代码了,但据我所知,如果 select_image 的运算符 bool() 返回 true,它只会进入 if 块,并且在退出 if 块时会破坏 select_image 的实例。

PREfast 错了吗?或者这里有什么微妙的东西使我上面的代码和假设不正确?

0 投票
3 回答
967 浏览

c++ - 返回指向缓存在 std::map 中的项目的指针

我有一个充当缓存的类。它有以下私有成员:

我需要为此缓存编写一个 getter,它返回一个引用、指针、迭代器或智能指针,指向存储在缓存中的 Foo 对象。如果需要,我希望客户端能够通过 getter 更新 Foo 对象。

但是,如果在缓存中找不到该项目,我不希望 getter 抛出。相反,客户端应该测试返回的值以确定是否找到了该项目。但是,如果您推荐这种方法,我可以说服我投掷。

你会为我的 getter 推荐什么返回类型?

我正在使用 boost 和 C++98。

0 投票
1 回答
1869 浏览

c++ - 初始化一个 std::vector> 使用 boost::assign::list_of

如何使用 boost::assign::list_of 将值放入类型的对象中std::vector<std::vector<int> >?或者您对我如何填充它以进行单元测试有任何其他建议吗?

更新

我收到以下 gcc 4.4.2 的编译器错误

这是我的代码:

0 投票
1 回答
5064 浏览

c++ - 使用 boost::assign::list_of 构造 std::vector 时的歧义

这段代码:

给出错误:

为 gcc 4.4.2 编译时。

我该如何解决这个问题?最终我试图编译以下内容:

出于同样的原因,这失败了。

我的应用程序涉及为单元测试设置数据结构。我希望初始化清楚,而不是必须做很多 push_backs 等。

更新:

这是一个修复:

这太丑陋了。我该怎么做才能使这一点更清楚。我的单元测试只写在头文件中,所以我不使用using namespace.

0 投票
1 回答
151 浏览

c++ - 使用命名空间和标头

我正在做一个项目,我在头文件中编写了几乎所有的测试代码。我这样做主要是因为我正在做测试驱动的开发,这导致我添加的每个类都有大量的互补类:接口、测试、模拟等。我想如果我也必须处理的话我会发疯的使用所有这些文件的 cpp 版本...

我没有在标题的开头添加“使用命名空间 std”,因为我知道这是一个不,不。无论如何,假设我目前在测试开始时初始化我的 Blob 对象,如下所示:

其中 Blob 在typedef某处被编辑为std::vector<std::pair<std::string, Container > >.

我怎样才能让这个更漂亮?我使用 list_of 的原因是为了使内容更具可读性,但在这种情况下,我认为它使阅读变得更加困难。这好多了:

但我不能在标题中这样做......

我可以做些什么来解决这个问题?我正在使用 C++98。

更新:

只是一个想法。如果我将所有测试头文件重命名为 cpp 文件会怎样?

0 投票
4 回答
1803 浏览

c++ - 返回一堆值的接口

我有一个函数,它接受一个数字并返回很多东西(比如整数)。最干净的界面是什么?一些想法:

  1. 返回一个vector<int>。该向量将被复制多次,这是低效的。
  2. 返回一个vector<int>*。我的 getter 现在必须分配向量本身以及元素。有谁必须释放向量的所有常见问题,事实上你不能分配一次并为许多不同的 getter 调用使用相同的存储,等等。这就是为什么 STL 算法通常避免分配内存,而不是想要它通过了。
  3. 返回一个unique_ptr<vector<int>>。现在很清楚是谁删除了它,但我们还有其他问题。
  4. 以 avector<int>作为参考参数。getter 可以push_back()和caller 可以决定是否给reserve()空间。但是,如果传入的vector不是空的,getter 应该怎么做呢?附加?通过先清除来覆盖?断言它是空的?如果函数的签名只允许单一解释,那就太好了。
  5. 传递一个beginend迭代器。现在我们需要返回实际写入的项目数(可能比预期的要小),调用者需要注意不要访问从未写入过的项目。
  6. 让 getter 接受一个iterator,而调用者可以传递一个insert_iterator
  7. 放弃,只是通过一个char *. :)
0 投票
1 回答
2787 浏览

c++ - C++11 异常的析构函数现在允许抛出吗?

知道为什么 virtual ~exception() throw() 在 C++98 中,但 virtual ~exception() 在 C++11 中吗?

允许 C++11 加入类的析构函数的设计决策是什么exception

这里

c++98:

c++11:

0 投票
4 回答
19550 浏览

c++ - 前向声明和 shared_ptr

我正在尝试重构我的代码,以便我使用前向声明而不是包含大量标题。我是新手,对 boost::shared_ptr 有疑问。

假设我有以下界面:

然后我在另一个类中有一个函数,它接受一个 IStarterPtr 对象作为参数,比如:

如何在不包含 IStarter.h 的情况下转发声明 IStarterPtr?

如果相关的话,我正在使用 C++98。

0 投票
3 回答
2008 浏览

c++ - 用于包装采用 void* 参数的 C 回调的模板魔术?

假设我正在使用一个 C API,它可以让你注册回调函数void*

在 C++ 中,拥有比这更强大的类型很好,void*所以我想创建一个包装器,让我注册强类型的 C++ 回调:

这工作正常。这个解决方案的一个很好的特性是它可以将我的回调内联到包装器中,所以这个包装方案的开销为零。我认为这是一个要求。

但如果我能让 API 看起来更像这样,那就太好了:

我希望我可以通过推断模板参数来实现上述目标。但我不太清楚如何使它工作。到目前为止,我的尝试是:

但这不起作用。任何人都有一个神奇的咒语,可以在f2()上面工作,同时保持零开销的性能特征?我想要一些可以在 C++98 中工作的东西。