小编ved*_*edg的帖子

在C++ 11中禁用复制类的最简洁方法

自从C++ 11默认生成复制构造函数和复制赋值运算符(存在用户定义的析构函数)时,我遇到了一个问题.

对于大多数足够简单的类,默认生成的构造函数,运算符和析构函数都可以.请考虑以下原因来声明析构函数:

  1. 在基类中创建虚拟析构函数虚拟:

    // header
    class Base1 { public: virtual ~Base1() = default; };
    class Base2 { public: virtual ~Base2(); };
    // source
    Base2::~Base2() = default;
    
    Run Code Online (Sandbox Code Playgroud)

    在这些情况下,编译器是否会生成4个复制和移动特殊方法?如果是,那么我认为它很好,没有必要复杂化Base1Base2.

  2. 在析构函数中打印调试消息:

    // header
    class D { public: ~D(); };
    // source
    D::~D() {
    #ifdef DEBUG_THIS
        std::cout << "D was destructed." << std::endl;
    #endif
    }
    
    Run Code Online (Sandbox Code Playgroud)

    我相信在这种情况下会生成复制构造函数和赋值运算符; 但移动构造函数和赋值运算符不会.我想避免使用已弃用的默认生成和禁用复制D.我还想避免D4次deleted声明泛滥.是否仅禁用一个复制构造函数?这是一种好风格吗?

c++ destructor c++11

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

C++中的全局常量11

在C++中声明和定义全局常量的最佳方法是什么?我最感兴趣的是C++ 11标准,因为它在这方面做了很多修复.

[编辑(澄清)]:在这个问题中,"全局常量"表示在编译时在任何范围内已知的常量变量或函数.必须可以从多个翻译单元访问全局常量.它不一定是constexpr风格不变-可以是这样const std::map<int, std::string> m = { { 1, "U" }, { 5, "V" } };const std::map<int, std::string> * mAddr() { return & m; }.在这个问题中,我没有触及优选的好的范围或常数名称.让我们把这些问题留给另一个问题.[END_EDIT]

我想知道所有不同情况的答案,所以让我们假设这T是以下之一:

typedef    int                     T;  // 1
typedef    long double             T;  // 2
typedef    std::array<char, 1>     T;  // 3
typedef    std::array<long, 1000>  T;  // 4
typedef    std::string             T;  // 5
typedef    QString                 T;  // 6
class      T {
   // unspecified amount of code
};                                     // 7
// …
Run Code Online (Sandbox Code Playgroud)

c++ const constexpr c++11

17
推荐指数
1
解决办法
7252
查看次数

如何在注销时优雅地退出QApplication?

我有一个带有通知区域图标的应用程序,因此主窗口可能会忽略关闭事件.我正在尝试保存应用程序退出的首选项和历史记录.我还想在应用程序运行时处理注销.虽然应用程序是跨平台的,但它在GNU/Linux中最方便/最有用,因此Windows注销行为的关注度要低得多.这是一个用于测试不同桌面环境/窗口管理器行为的最小可编译示例:

// main.cpp
# include <QApplication>
# include <QMainWindow>
# include <QCloseEvent>
# include <QTimer>
# include <iostream>

class M : public QMainWindow
{
    Q_OBJECT
public:
    ~M();
public slots:
    void onAboutToQuit();
private:
    void closeEvent(QCloseEvent *);
};

M::~M()
{
    std::cout << "M::~M()" << std::endl;
}

void M::onAboutToQuit()
{
    std::cout << "onAboutToQuit()" << std::endl;
}

void M::closeEvent(QCloseEvent * e)
{
    std::cout << "closeEvent()" << std::endl;
    hide();
    QTimer::singleShot(5000, this, SLOT(show()));
    e->ignore();
}

int main(int argc, char * argv[])
{
    QApplication app(argc, argv);

    M …
Run Code Online (Sandbox Code Playgroud)

c++ linux qt qt4 qt5

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

标签 统计

c++ ×3

c++11 ×2

const ×1

constexpr ×1

destructor ×1

linux ×1

qt ×1

qt4 ×1

qt5 ×1