标签: effective-c++

关于从基类到子类指针的向下转换

静态检查工具显示违反以下代码:

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'类

描述:避免强制转换继承层次结构.此规则检测从基类指针到子类指针的强制类型转换.

好处:允许强制转换继承层次结构会导致维护问题,而从基类进行向下转换始终是非法的.

参考文献:

  1. Scott Meyers,"有效的C++:50种改进程序和设计的具体方法",第二版,Addison-Wesley,(C)2005 Pearson Education,Inc.,章节:"继承和面向对象设计",第39项
  2. 联合攻击手,空中车辆,C++编码标准第4.23章类型转换,AV规则178

你认为不从基类指针转换为子类指针是一个好习惯吗?为什么以及何时应遵循此规则?

c++ mfc static-analysis casting effective-c++

5
推荐指数
2
解决办法
9392
查看次数

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

我知道更有效的C++是有效C++的扩展,而有效的现代C++则专注于C++ 11和14.作为语言的新手并且刚开始使用这些书籍,我应该在前两个之后阅读Effective Modern吗?此外,有效STL适合哪里?

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

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

c++ effective-c++

5
推荐指数
1
解决办法
1302
查看次数

函数指针的赋值(有效的c ++项目35)

有效的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)

在第六行,为什么赋值函数指针HealthCalcFuncdefaultHealthCalc不是&defaultHealthCalc

c++ function-pointers effective-c++

5
推荐指数
1
解决办法
164
查看次数

了解 Scott Meyers 的第三个 std::weak_ptr 示例

在137页的最后一个例子有效的现代C ++绘制与对象的数据结构的情况下AB以及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指向它?

然而,这本书并没有提到这个“限制”/假设/任何东西,所以事实是

  • 我错了
  • 我是对的,但由于某种原因,这个假设很明显,我不明白
  • 由于 astd::weak_ptr 需要一个已经存在std::shared_ptr于同一个对象的确切原因,这个假设是显而易见的,但我认为这有点奇怪,它甚至在示例的开头都没有提到。

我问这个问题是为了理解这一点。

c++ shared-ptr effective-c++ weak-ptr c++11

5
推荐指数
1
解决办法
204
查看次数

面试问题; Effective C++的主题是什么?

在最近的一次面试中我被问到以下问题:

您认为Scott Meyers的Effective C++系列的主题/单个词是什么?

你对这个问题的答案是什么?

c++ effective-c++

4
推荐指数
3
解决办法
1450
查看次数

我是否正确理解了Scott Meyers关于std :: weak_ptr的例子?

有效的Modern C++(第136页)使用以下示例进行激励std::weak_ptr.缓存被定义为无序映射,其中指向对象的弱指针作为值.每当此缓存的客户端(通过密钥)请求对象时,将查找相应的弱指针并lock()在其上调用.如果结果std::shared_ptr不是null,则返回.否则,从外部数据库重新加载对象,输入到缓存中并std::shared_ptr返回该对象.

现在的问题是:有人可能认为可以在没有的情况下实现它std::weak_ptr,而是将强大的共享指针存储为缓存值.如果use_count()强指针等于1,则意味着所有客户端的指针都已被销毁.这个例子的重点是使用std::weak_ptr允许我们通过实际删除对象来节省内存吗?

c++ effective-c++ weak-ptr c++11

4
推荐指数
1
解决办法
611
查看次数

如何理解此声明中的typedef

最近,我读了有效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++ typedef forward-declaration effective-c++

4
推荐指数
4
解决办法
942
查看次数

有效的C++:第41项 - 关于隐式接口的混淆

我正在阅读有效的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 ...

你能解释一下它的含义并举出更多例子吗?

c++ effective-c++

4
推荐指数
1
解决办法
97
查看次数

功能类宏和奇怪的行为

我已经开始阅读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在第一次打电话中打印,但我不能为我的生活找出原因.我错过了一些明显的东西吗

c++ macros effective-c++

3
推荐指数
1
解决办法
240
查看次数

集装箱前后行为

以下是"Effective STL"的引用:

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

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

c++ stl effective-c++

3
推荐指数
1
解决办法
148
查看次数