相关疑难解决方法(0)

用C++ 11重构

鉴于c ++许多程序员提供的新工具集,旨在实现代码简化,表达性,效率,浏览旧代码并进行调整(有些无意义,有些成功)以实现他们的目标.尽管不要在这些工作上浪费太多时间,只是做出非侵入性和自包含的变化,但最佳做法是什么?

让我勾勒出明显的:

  • 使用auto运行基于迭代器的循环:

    for (std::vector<foo>::const_iterator it(lala.begin()), ite(lala.end()); it != ite;     
    ++it);
    // becomes
    for (auto it(lala.cbegin()), ite(lala.cend()); it != ite; ++it);
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用tie来进行多个赋值,这些赋值只产生C风格的代码行(如何一次将多个值分配到结构中?)

    a = 1;
    b = 2; 
    c = 3;
    d = 4; 
    e = 5;
    // becomes
    std::tie(a, b, c, d, e) = std::make_tuple(1, 2, 3, 4, 5);
    
    Run Code Online (Sandbox Code Playgroud)
  • 要使类不可继承,只需将其声明为"final"并删除实现此类行为的代码http://www.parashift.com/c++-faq/final-classes.html

  • 使用delete关键字显式隐藏构造函数/析构函数,而不是将它们声明为私有(例如,用于创建基于堆的对象的代码,不可复制的对象等)

  • 创建简单的仿函数只是为了将单个STL算法的执行变为lambda函数(除了减少代码混乱,你还能保证内联调用)

  • 仅使用智能指针简化对象的RAII包装

  • 摆脱bind1st,bind2nd只需使用bind

  • <type_traits>提供的标准代码替换类型特征的手写代码(Is_ptr_but_dont_call_for_const_ptrs <>等:))

  • 停止包含现在在STL中实现的函数的boost标头(BOOST_STATIC_ASSERT vs static_assert)

  • 为类提供移动语义(虽然这不符合脏/快/易更改的条件)

  • 在可能的情况下使用nullptr而不是NULL宏,并删除填充指针的容器的代码,其中0已转换为对象类型

    std::vector<foo*> …
    Run Code Online (Sandbox Code Playgroud)

c++ refactoring c++11

68
推荐指数
9
解决办法
5120
查看次数

c ++中的最终类

class Temp
{
private:
    ~Temp() {}
    friend class Final;
};

class Final : virtual public Temp
{
public:
     void fun()
     {
         cout<<"In base";
     }
};

class Derived : public Final
{
};

void main()
{
    Derived obj;
    obj.fun();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码试图实现不可继承的类(final).但是使用上面的代码仍然可以创建派生的对象,为什么呢?

只有当ctor私有化时才能实现所需的功能,我的问题是为什么在dtor私有的情况下无法实现?

c++ inheritance final virtual-inheritance

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

哪些有效的 C++ 项目可以通过 C++11 更好地实现?如何?

由于《Effective C++》这本书似乎 仍然值得阅读,并且最好从《Effective C++》系列开始,我想知道哪些建议的解决方案/实现我不需要详细理解/记住,因为 C++11 或更高版本中有更好的解决方案。所以:

哪些有效的 C++ 项目可以通过 C++11 或更高版本实现更简单或更好?现在如何实施,哪种方式更好?


细节:

由于C++11 中弃用了许多 C++ 习惯用法,我想这也会影响《Effective C++》一书中的解决方案。例如,查看其目录,我猜想(因为我还没有读过这本书)

  • 第 6 项(明确禁止使用您不想要的编译器生成的函数)变得更简单=delete
  • 第 17 项(在独立语句中将新对象存储在智能指针中)通过make_shared(以及 C++14 的make_unique)变得更简单
  • 第 21 条(必须返回对象时不要尝试返回引用)通过移动语义变得更简单、更高效
  • 第 55 条(熟悉 Boost)现在的示例较少,因为许多 boost 功能也是 C++11 或更高版本的一部分。

正确的?还有吗?这些项目是如何在现代 C++ 中实现的?

c++ deprecated c++11 c++14

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

为什么cppcheck工具找不到未初始化的变量?

我运行commad(Ubuntu 12.04)

cppcheck test.cpp
Run Code Online (Sandbox Code Playgroud)

我期待来自cppcheck工具的未初始化变量警告.为什么cppcheck工具不能在命令行上打印它?

示例cpp代码:

#include <iostream>

class Foo
{
private:
    int m_nValue;

public:
    Foo();
    int GetValue() { return m_nValue; }
};

Foo::Foo()
{
    // Oops, we forget to initialize m_nValue
}

int main()
{
    Foo cFoo;
    if (cFoo.GetValue() > 0)
    {//...
    }
    else
    {//...
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ warnings initialization cppcheck

3
推荐指数
2
解决办法
2101
查看次数