问题标签 [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.
c++ - 使用“不可复制”类时消除 GCC 警告
我有几个我不想被复制的类,其中一些类有指针数据成员。为了使这些类不可复制,我私下继承了以下类模板:
我这样使用:
这很好用,但是当我使用 -Weffc++ 编译时,我仍然收到以下警告:
为什么它仍然给我这个警告?
c++ - 面试题;Effective C++ 的主题是什么?
在最近的一次工作面试中,我被问到以下问题:
您认为总结 Scott Meyers 的 Effective C++ 系列的主题/单词是什么?
你会怎么回答这个问题?
c++ - 在头文件中将值设置为“const char *”是否合适
我见过人们使用 2 种方法来声明和定义char *
.
方法1:头文件有以下内容
方法2:
头文件有以下声明:
cpp 文件具有以下定义:
- 方法1在某种程度上是错误的吗?
- 两者有什么区别 ?
const char * const var
我理解 " " 和 " "之间的区别const char * var
。如果在上述方法中,如果const char * const var
像方法 1 一样在标头中声明和定义“”,是否有意义?
c++ - C++:将 const 与 STL 迭代器一起使用
来自Effective C++,第 3 项
为了记住如何const
应用,我曾经记住这篇文章中的以下内容
基本上,“const”适用于其最左边的任何东西(除非那里没有任何东西,在这种情况下,它适用于它最右边的任何东西)。
当我第一次阅读本书中的第 3 项时,我预计 case1 和 case2 会相反。
我应该将这种情况视为例外吗?还是我缺少一些更深层次的理解?
c++ - 关于从基类向下转换到子类指针
静态检查工具显示违反以下代码:
错误消息: “CSplitFrame”类继承自“CWnd”类
描述:避免向下继承继承层次结构。此规则检测从基类指针到子类指针的强制转换。
好处:允许向下转换继承层次会导致维护问题,并且从基类向下转换总是非法的。
参考:
- Scott Meyers,“有效的 C++:50 种改进程序和设计的具体方法”,第二版,Addison-Wesley,(C) 2005 Pearson Education, Inc.,章节:“继承和面向对象的设计”,第 39 项
- JOINT STRIKE FIGHTER, AIR VEHICLE, C++ 编码标准第 4.23 章类型转换,AV 规则 178
您认为不从基类指针向下转换为子类指针是一个好习惯吗?为什么以及何时我应该遵守这条规则?
c++ - 前向声明包括,在声明包括之上(ClassFwd.h + Class.h)
在 Effective C++(第 3 版)中,Scott Meyers 在第 31 条中建议类应该在其经典的声明 (.h) 和定义 (.cpp) 文件之上具有前向声明包含文件 (fwd.h),不需要完整定义的类可以使用,而不是前向声明自己。
我有点看到它的情况,但我真的不认为这是一个可行的选择......它似乎很难维护,相当矫枉过正而且几乎没有必要。
但是,我可以看到它用于模板前向声明,这是相当繁重的。但是对于简单的课程?似乎维护起来很痛苦,并且会创建大量几乎为空的包含文件,这些文件的用途非常小……值得麻烦吗?
这是一个例子:
我的问题:
你们有什么感想?如果这是一个好习惯?
注意我最感兴趣的是这种做法的论点,看看我是否遗漏了一些能让我同意 Scott Meyers 的东西。
c++ - 从派生类中调用运算符 =
这是来自有效 C++ 第 2 版 scott meyers 的第 16 项(第 70 页)
作者没有太多解释地写道,当基类运算符 = 以下列方式调用时
一些编译器(尽管错误地)拒绝这个,如果它operator =
是由编译器生成的(见第 45 条)所以更好地使用
在第 45 项中,他提到如果基类operator =
是私有的,则派生类=
无权调用它。
但在最初的问题中,编译器拒绝它,因为它是由编译器生成的(必须是公开的)
对此的任何帮助(链接)都会有所帮助。(谷歌这些类型的问题很难)
c++ - Effective C++ Item 23 Prefer non-member non-friend functions to member functions
在对类设计的一些事实感到困惑时,特别是函数是否应该是成员,我查看了 Effective c++ 并找到了第 23 条,即 Prefer non-member non-friend functions to member functions。使用 Web 浏览器示例第一手阅读该内容是有一定道理的,但是该示例中的便利函数(在书中像这样命名非成员函数)会改变类的状态,不是吗?
那么,第一个问题,他们不应该成为会员吗?
进一步阅读,他考虑了 STL 函数,实际上某些类未实现的一些函数是在 stl 中实现的。按照本书的想法,它们演变成一些方便的函数,这些函数被打包到一些合理的命名空间中
std::sort
,例如std::copy
fromalgorithm
。例如vector
,类没有sort
函数,并且使用 stlsort
函数,因此它不是向量类的成员。但是也可以将相同的推理扩展到向量类中的其他一些函数,例如,assign
它也不能作为成员实现,而是作为便利函数实现。然而,这也会改变对象的内部状态,比如它所操作的排序。那么这个微妙但重要(我猜)的问题背后的基本原理是什么。
如果您可以访问这本书,您能否为我进一步澄清这些观点?
c++ - Effective C++ 《35. 最小化文件之间的编译依赖》。今天还有效吗?
在本章中,Scott Meyer 提到了一些避免头文件依赖的技术。如果更改仅限于其他包含的头文件,主要目标是避免重新编译 cpp 文件。
我的问题是:
在我过去的项目中,我从未关注过这条规则。编译时间不短但也不是不能忍受。这可能与我的项目的规模(或缺乏)有关。鉴于编译器技术的进步(例如 clang),今天这个技巧有多实用?
我在哪里可以找到更多使用这种技术的例子?(例如 Gnome 或其他 OSS 项目)
PS我使用的是第二版。
c++ - 有效的 C++:不鼓励受保护的继承?
我正在阅读 Scott Meyers 的Effective C++(第三版),在第32 条的一段中:确保公共继承是第 151 页的“is-a”,他发表了评论(我用粗体表示):
这仅适用于公共继承。只有当 Student 是公开派生自 Person 时,C++ 才会像我所描述的那样运行。私有继承意味着完全不同的东西(参见第 39 条),而受保护的继承是我至今仍无法理解的东西。
问题:我应该如何解释这个评论?Meyers 是否试图传达受保护的继承很少被认为有用并且应该避免?
(我已经阅读了 私有、公共和受保护继承之间的区别以及C++ FAQ Lite 的私有和受保护继承部分的问题,两者都解释了受保护继承的含义,但并没有让我深入了解何时或为什么它会很有用。)