静态检查工具显示违反以下代码:
class CSplitFrame : public CFrameWnd
...
class CVsApp : public CWinApp
CWnd* CVsApp::GetSheetView(LPCSTR WindowText)
{
CWnd* pWnd = reinterpret_cast<CSplitFrame*>(m_pMainWnd)->m_OutputBar.GetChildWnd(WindowText);
return pWnd;
}
Run Code Online (Sandbox Code Playgroud)
错误消息:类'CSplitFrame'继承自'CWnd'类
描述:避免强制转换继承层次结构.此规则检测从基类指针到子类指针的强制类型转换.
好处:允许强制转换继承层次结构会导致维护问题,而从基类进行向下转换始终是非法的.
参考文献:
- Scott Meyers,"有效的C++:50种改进程序和设计的具体方法",第二版,Addison-Wesley,(C)2005 Pearson Education,Inc.,章节:"继承和面向对象设计",第39项
- 联合攻击手,空中车辆,C++编码标准第4.23章类型转换,AV规则178
你认为不从基类指针转换为子类指针是一个好习惯吗?为什么以及何时应遵循此规则?
我知道更有效的C++是有效C++的扩展,而有效的现代C++则专注于C++ 11和14.作为语言的新手并且刚开始使用这些书籍,我应该在前两个之后阅读Effective Modern吗?此外,有效STL适合哪里?
阅读上述书籍的首选顺序是什么,因为每本书都是基于先前书籍的内容?(假设里面的一切对我来说都是新的?)
另外,Effective Modern C++是否被认为是Effective C++的非官方下一版?
在有效的c ++,第35项中,作者通过函数指针介绍了策略模式.具体在第172页
class GameCharacter;
int defaultHealthCalc(const GameCharacter& gc);
class GameCharacter {
public:
typedef int (*HealthCalcFunc)(const GameCharacter&);
explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)//why not &defaultHealthCalc?
: healthFunc(hcf)
{}
int healthValue() const
{ return healthFunc(*this); }
...
private:
HealthCalcFunc healthFunc;
};
Run Code Online (Sandbox Code Playgroud)
在第六行,为什么赋值函数指针HealthCalcFunc是defaultHealthCalc不是&defaultHealthCalc?
在137页的最后一个例子有效的现代C ++绘制与对象的数据结构的情况下A,B以及C在其中,经由连接到彼此std::shared_ptr以如下方式:
std::shared_ptr std::shared_ptr
A ?????????????????? B ?????????????????? C
Run Code Online (Sandbox Code Playgroud)
对我来说,这意味着类的对象A,并C为实例(两个不相关的类,在一般情况)必须包含一个std::shared_ptr<classOfB>成员。
然后假设我们需要一个从Bback to的指针A,并列出了可用的选项:指针可以是原始的、共享的或弱的,最后一个被选为最佳候选。
std::shared_ptr std::shared_ptr
A ?????????????????? B ?????????????????? C
? ?
? std::weak_ptr ?
??????????????????????
Run Code Online (Sandbox Code Playgroud)
我确实理解前两种选择的弱点(ahahah),但我也看到第三种选择要求该成员A已经由 some 管理std::shared_ptr,否则怎么可能std::weak_ptr指向它?
然而,这本书并没有提到这个“限制”/假设/任何东西,所以事实是
std::weak_ptr 需要一个已经存在std::shared_ptr于同一个对象的确切原因,这个假设是显而易见的,但我认为这有点奇怪,它甚至在示例的开头都没有提到。我问这个问题是为了理解这一点。
在最近的一次面试中我被问到以下问题:
您认为Scott Meyers的Effective C++系列的主题/单个词是什么?
你对这个问题的答案是什么?
有效的Modern C++(第136页)使用以下示例进行激励std::weak_ptr.缓存被定义为无序映射,其中指向对象的弱指针作为值.每当此缓存的客户端(通过密钥)请求对象时,将查找相应的弱指针并lock()在其上调用.如果结果std::shared_ptr不是null,则返回.否则,从外部数据库重新加载对象,输入到缓存中并std::shared_ptr返回该对象.
现在的问题是:有人可能认为可以在没有的情况下实现它std::weak_ptr,而是将强大的共享指针存储为缓存值.如果use_count()强指针等于1,则意味着所有客户端的指针都已被销毁.这个例子的重点是使用std::weak_ptr允许我们通过实际删除对象来节省内存吗?
最近,我读了有效C++这本书,第35项中有关于typedef的声明使我感到困惑.
class GameCharacter; // Question1: Why use forward declaration?
int defaultHealthCalc(const GameCharacter& gc);
class GameCharacter{
public:
typedef int (*HealthCalcFunc)(const GameCharacter&); // Question 2: What does this mean?
explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)
: healthFunc(hcf)
{}
int healthValue() const
{return healthFunc(*this); }
private:
HealthCalcFunc healthFunc;
};
Run Code Online (Sandbox Code Playgroud)
所以我的第一个问题是:为什么作者在这里使用前瞻性声明?有什么具体原因吗?
我的第二个问题是:我如何理解typedef声明,以及如何使用它?我只知道类似的东西typedef int MyInt;
我正在阅读有效的C++,第41项,标题为"理解隐式接口和编译时多态性",它给出了这个例子,接下来是一个解释,但我不理解这一部分.
template<typename T>
void doProcessing(T& w)
{
if (w.size() > 10 && w != someNastyWidget) {
...
Run Code Online (Sandbox Code Playgroud)
...,T必须支持一个size成员函数,.....,但是这个成员函数不需要返回一个整数类型.它甚至不需要返回数字类型.就此而言,它甚至不需要返回
>定义了运算符的类型!它需要做的就是返回一个x类型的对象,这样>就可以调用一个运算符,类型为x的对象和一个int ...
你能解释一下它的含义并举出更多例子吗?
我已经开始阅读Effective C++了,在第2项的某些时候,提到了以下内容:
// call f with the maximum of a and b
#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))
...
int a = 5, b = 0;
CALL_WITH_MAX(++a, b); // a is incremented twice
CALL_WITH_MAX(++a, b+10); // a is incremented once
Run Code Online (Sandbox Code Playgroud)
这里,a在调用f之前递增的次数取决于它与之比较的次数!
事实上,如果我使用一个简单的打印声明f,7在第一次打电话中打印,但我不能为我的生活找出原因.我错过了一些明显的东西吗
以下是"Effective STL"的引用:
当您从容器中获取对象时(通过例如正面或背面),您设置的是所包含内容的副本.复制,复制出来.这是STL的方式.
我很难理解这一部分.据我所知,front返回第一个元素的引用(至少为std::vector).你能解释一下这句话吗?
c++ ×10
effective-c++ ×10
c++11 ×2
weak-ptr ×2
casting ×1
macros ×1
mfc ×1
shared-ptr ×1
stl ×1
typedef ×1