问题标签 [effective-c++]

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 投票
3 回答
24555 浏览

c++ - 为什么需要一个空的 shared_ptr 以及如何使用它?

在 Scott Meyers 的Effective C++中,第 18 项使接口易于正确使用和难以正确使用,他提到了 null shared_ptr:

和时尚分配操作

在这种情况下,可能需要创建一个空 shared_ptr 并稍后进行分配?为什么不只要有资源(原始指针)就创建 shared_ptr 呢?

由于 Scott Meyers 没有在前面的示例中显示完整的赋值,我认为 shared_ptr 的赋值运算符被重载,可以这样做:

但是我尝试了boost的实现,但它不能以这种方式工作。那么拥有 null shared_ptr 有什么意义呢?

我几乎可以肯定我在这里遗漏了一些东西,请有人帮我解决这个问题。

附言。有关 shared_ptr 的初始化和分配的更多信息

这个例子不能被g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2和最新的 boost 编译:

0 投票
1 回答
385 浏览

c++ - MinGW 中的“有效 C++”警告

MinGW 有这个选项,你可以启用它来显示 Scott Meyers 的Effective C++建议的警告。我没有这本书,也不能轻易得到它的副本,我现在也没有时间阅读它,所以我的问题是,这些“迈耶斯警告”到底是什么?

0 投票
4 回答
6369 浏览

c++ - 为什么 static_cast(*this) 到基类会创建一个临时副本?

我正在阅读Effective C++并遇到了这个例子:

书上说:

您可能没想到的是它不会在当前对象上调用该函数!相反,强制转换为 *this 的基类部分创建一个新的临时副本,然后在副本上调用 onResize!

为什么 static_cast (上面的代码)会创建一个新副本?为什么不只使用对象的基类部分?

0 投票
5 回答
2056 浏览

c++ - C++:Scott Meyers “Effective STL”:第 31 项:了解您的排序选项:帮助理解

再会!

Scott Meyers 在他的“Effective STL”中写道

第三种是使用迭代器的有序容器中的信息将列表的元素迭代地拼接到您希望它们所在的位置。如您所见,有很多选项。(第 31 项,第二部分)

有人可以这样解释我吗?


更多文字(以了解上下文):

算法 sort、stable_sort、partial_sort 和 nth_element 需要随机访问迭代器,因此它们可能仅适用于向量、字符串、双端队列和数组。对标准关联容器中的元素进行排序是没有意义的,因为这些容器使用它们的比较函数来始终保持排序。我们可能希望使用 sort、stable_sort、partial_sort 或 nth_element 但不能使用的唯一容器是 list,而 list 通过提供它的 sort 成员函数来进行一些补偿。(有趣的是,list::sort 执行稳定的排序。)如果要对列表进行排序,则可以,但是如果要对列表中的对象使用 partial_sort 或 nth_element,则必须间接进行。一种间接方法是将元素复制到具有随机访问迭代器的容器中,然后对其应用所需的算法。第三种是使用迭代器的有序容器中的信息将列表的元素迭代地拼接到您希望它们所在的位置。如您所见,有很多选项。

0 投票
3 回答
4102 浏览

c++ - 我可以使用流运算符重写日志记录宏以使用 C++ 模板函数吗?

我们的项目使用一个宏在一行语句中使日志记录变得容易和简单,如下所示:

该宏将第二个参数转换为字符串流参数,并将其发送到常规 C++ 记录器。这在实践中效果很好,因为它使多参数日志记录语句非常简洁。然而,Scott Meyers 在Effective C++ 3rd Edition中说过, “通过使用内联函数的模板,您可以获得宏的所有效率以及常规函数的所有可预测行为和类型安全性”(第 2 项)。我知道 C++ 中宏的使用存在许多与可预测行为相关的问题,因此我试图在我们的代码库中消除尽可能多的宏。

我的日志记录宏定义类似于:

我已经尝试过几次将其重写为不使用宏的东西,包括:

和...

无济于事(上述 2 次重写都不会针对第一个示例中的日志记录代码进行编译)。还有其他想法吗?这可以做到吗?还是最好将其保留为宏?

0 投票
1 回答
659 浏览

c++ - 防止构造多个对象

我正在阅读 Effective C++,所以我尝试实现防止构造多个对象的类(第 4 项):

为什么在 boolWrapper 构造函数的主体之前没有调用 boolWrapper 的 T() 构造?是不是因为 boolWrapper 没有 T 类型的数据成员,并且它没有从 T 继承(没有隐式调用父 ctor)?

另外,我在没有搜索解决方案的情况下进行了编码,我是否犯了任何设计错误?

0 投票
5 回答
301 浏览

c++ - 对引用计数感到困惑

感谢您提前提供帮助。我正在阅读 Scott Meyers 的《更有效的 C++》一书,但第 29 条“引用计数”中的一个简单程序确实让我感到困惑。程序复制到这里:

String::String(const String& rhs): value(rhs.value) { ++value->refCount; }

然后代码:

我真的很困惑为什么 s1 和 s2 都会有一个 refCount 2。我的理解是,由于复制构造函数是 pass-by-reference-to-const,在 s2=s1,s2.refCount 将变为 2,而 s1.refCount 将变为 2。 refCount 根本不会改变。请纠正我!!再次感谢。

此致。

0 投票
5 回答
1458 浏览

c++ - C ++中的模板,为什么必须使用枚举

我对 Scott Meyers 的“Effective C++”中的第 48 项有一个简短的问题。我只是不明白从下面的书中复制的代码,

为什么我必须在模板编程中使用枚举?有没有其他方法可以做到这一点?我在这里先向您的帮助表示感谢。

0 投票
2 回答
693 浏览

c++ - 有效的 c++ item 3 示例

我的问题是关于“Effective C++”一书的特定项目(3)。这本书给出了这个例子,我试图尽可能地重现到 vs 2010 c++(包括 iostream 和字符串)中:

我得到这些编译错误:

首先让我说,我很沮丧已经被困在本书的这个早期阶段。我以某种方式在这里找到了信息:
static_cast<const A>(*this) 和 static_cast<const A&>(*this) 之间的区别
但不是像书中那样的有效答案。我想让这本书的例子工作,这样我就可以理解它是如何工作的。我已经坚持了很多天了,我必须承认我需要帮助。我想知道我是否在这里遗漏了一个基本概念,或者我是否太过分了。谢谢。

0 投票
6 回答
2302 浏览

c++ - “避免将句柄返回到对象内部”,那么替代方案是什么?

Scott Meyers 编写的 Effective C++在第 5 章第 28 条中指出要避免将“句柄”(指针、引用或迭代器)返回到对象内部,这绝对是一个好点。

即不要这样做:

因为它破坏了封装并允许更改私有对象成员。

甚至不要这样做:

因为它可能导致“悬空句柄”,这意味着您保留对已销毁对象成员的引用。

现在,我的问题是,有什么好的选择吗?想象妈妈很重!如果我现在返回 Mother 的副本而不是参考,GetMother 将成为一项相当昂贵的操作。

您如何处理此类案件?