问题标签 [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 投票
1 回答
3077 浏览

c++ - 阅读有效、更有效和有效的现代 C++(和 STL)的首选顺序是什么?

我知道 More Effective C++ 是 Effective C++ 的扩展,而 Effective Modern C++ 专注于 C++11 和 14。作为该语言的新手并且刚刚开始阅读这些书籍,我应该在前两本书之后阅读 Effective Modern 吗?另外,Effective STL 应该适用于哪里?

阅读上述书籍的首选顺序是什么,因为每本书都建立在先前书籍的内容之上?(假设里面的一切对我来说都是新的?)

此外,Effective Modern C++ 是否被认为是 Effective C++ 的非官方下一版?

0 投票
1 回答
245 浏览

c++ - 解释器模式中的错误处理

假设我想将阿拉伯数字 (1+2) 或罗马数字 (I+II) 相加,并使用如下所示的解释器模式:

(代码来自这里:https ://en.wikibooks.org/wiki/C%2B%2B_Programming/Code/Design_Patterns#Interpreter )

如何确保正确处理错误查询(1+II)?我能想到的唯一解决方案是以某种方式使用强制转换,但这听起来不像是一个优雅的解决方案。还是不应该那样使用模式?

当然,一种选择是为此编写两个单独的函数,但我很好奇它是否可以在一个函数中完成,因为我想将此模式用于更复杂的上下文无关语法。

编辑:我的问题也在这里描述。我引用相关部分:

然而,引入一种语言及其附带的语法也需要对拼写错误的术语或错位的语法元素进行相当广泛的错误检查。

所以我的主要问题是:如何最好地设计广泛的错误检查?

0 投票
1 回答
89 浏览

c++ - 这是我的代码中的错误还是 g++ 对 -Weffc++ 的分析中的错误?

我收到 -Weffc++ 发出的警告,这似乎是错误的。我可以用第二双眼睛来确认:

警告是:

经测试g++ (GCC) 4.9.3

更新

添加了一个附加类以提供实现示例。警告本身是正确的,但我认为我不同意警告出现在纯虚函数上,因为它是另一个类的接口。

@Frerich Raabe 提供了必要的说明,说明为什么 g++ 认为我违反了 Effective C++ 设置的规则,并且我已经接受了这个答案。

为了使警告静音,我添加了以下内容:

0 投票
1 回答
450 浏览

c++ - 在 Effective C++ Item 3 中,为什么要使用 static_cast(*this) 而不是 static_cast(*这)?

我正在阅读 Scott Meyers 的 Effective C++ 3rd。
在第 3 项中:

尽可能使用 const。为了使用 const 成员函数 operator[],非 const 成员函数 operator[] 必须进行 2 次强制转换操作:

为什么斯科特迈耶斯使用static_cast<const TextBlock&>(*this)而不是static_cast<const TextBlock>(*this)

0 投票
1 回答
172 浏览

c++ - 什么是二进制可升级性?

我正在阅读 Scott Meyers 的 Effective C++。

在第 30 条中:了解 inline 的来龙去脉。他提到了二进制可升级性的概念。

0 投票
1 回答
158 浏览

c++ - 如何使基模板类函数在派生类中可见?

在《Effective C++》第44条:Factor parameter-independent code out of templates。我发现它的英文版和侯捷翻译的中文版有些不同。

这是我在第 214 页找到的英文版:

在侯捷翻译的中文版中。除了倒数第二行之外,前面几行代码几乎相同:

在中文版中,侯杰解释了使用this->invert(n)instead of的原因invert(n):模板化基类的函数名会隐藏在派生类中。
我认为这可能是错误的,因为using SquareMatrixBase<T>::invert;已经在派生类的其他部分添加了。

但我想,侯捷作为一个著名的翻译家,不会轻易犯这么明显的错误,这次他真的错了吗?

0 投票
3 回答
4670 浏览

c++ - static_cast 将此对象派生到 C++ 中的基类

在阅读 Item 27 Minimize cast in Effective C++时,它说不要尝试使用static_cast*this派生类转换为基类。因为static_cast<Base>(*this)会创建一个基类的临时对象。我尝试了一个如下示例,但是,它始终使用不同的编译器输出 10,例如 clang 3.8 和 gcc 4.9、5.3。

我错了吗?

问题是为什么static_cast会创建一个临时对象。

0 投票
3 回答
4019 浏览

c++ - C++ 在空类中编写和调用什么函数?

Effective C++一书中,我看到了以下段落:

结果,如果你写

它基本上和你写的一样:

以下代码将导致生成每个函数:

但是在反汇编上面的代码生成的可执行文件后,我意识到不是这样:没有任何函数被调用。

这是主要的汇编代码:

.text段中没有任何名为“Empty”的函数。

那么在我们调用构造函数或空类赋值之后,编译器的行为究竟是什么?它是否像书中所说的那样产生一些功能?如果是这样,它们存储在哪里?

0 投票
0 回答
306 浏览

c++ - 有效的c++项目31:重新编译

我正在阅读 Effective C++ Item 31: Minimize compiler dependencies between files。

它说:
在此处输入图像描述

我用下面的代码做了一个小测试:

//啊

//A.cpp

//TestA.h

//TestA.cpp

我有三个类,如TesetA.

首先我用makefile编译它们。然后我为 class 做一些改变A。例如,添加一些新的数据和成员函数,更改getInt(). 我重新编译它们。
但是,我发现只有 A.cpp 被重新编译。

这是我的生成文件:

现在我很困惑。如果我正确理解了第 31 条,难道不应该重新编译所有文件吗?

0 投票
2 回答
164 浏览

c++ - 容器前后行为

以下是“有效 STL”的引述:

当您从容器中获取对象时(例如,通过正面或背面),您设置的是所包含内容的副本。复制进来,复制出去。这就是 STL 的方式。

我很难理解这部分。据我所知,front 返回第一个元素的引用(至少对于std::vector)。你能解释一下上面的句子吗?