如何在派生类上使用初始化列表?

时间:2019-08-24 19:02:50

标签: c++ linux qt g++ initializer-list

我正在编写一个Qt派生类的应用程序。我的派生类还使用初始化程序列表来提供几个私有成员(通过构造函数进行设置)。现在,即使在允许的语法方面,我也有些困惑。我找到了这个post,并试图在我的小演示脚本中遵循它,并提出了以下建议:

QDialog
编译器抛出的

#include <QString>
#include <QSettings>
#include <QtWidgets/QWidget>
#include <QtWidgets/QDialog>

class foo : QDialog 
{
    Q_OBJECT
    public:
        foo(QSettings* const set=nullptr, const QString s="", QWidget *parent=nullptr) :  QDialog{
        public:
            foo(QSettings* const set=nullptr, const QString s="", QWidget *parent): QDialog(parent){}
        };
        QString nme_get() {return name;}
        void qux(void);

    private:
         const QString name;
         QSettings * const settings; 
};

void foo::qux(void) {
    QSettings *test = settings;
    QString name = nme_get();
    test->beginGroup(name);
    /*
     * ...
    */
    test->endGroup();
}


int main (void) {
    QWidget *parent = nullptr;
    QSettings *sttngs = new QSettings(QSettings::NativeFormat,QSettings::UserScope,"GNU","scaper",nullptr
);
    foo inst{sttngs, QString("quux"), parent};
    inst.qux();

    return 0;    
}

我知道由于我没有正确将类型提交给基类而出现错误,但是我不确定如何修改它以使其起作用... 也在https://doc.qt.io/qt-5/qdialog.html上 它说:foo.cpp: In constructor ‘foo::foo(QSettings*, QString, QWidget*)’: foo.cpp:12:9: error: expected primary-expression before ‘public’ public: ^ foo.cpp:12:9: error: expected ‘}’ before ‘public’ foo.cpp:12:9: error: no matching function for call to ‘QDialog::QDialog(<brace-enclosed initializer list>)’ In file included from /usr/include/x86_64-linux-gnu/qt5/QtWidgets/QDialog:1:0, from foo.cpp:4: /usr/include/x86_64-linux-gnu/qt5/QtWidgets/qdialog.h:93:5: note: candidate: QDialog::QDialog(QDialogPrivate&, QWidget*, Qt::WindowFlags) QDialog(QDialogPrivate &, QWidget *parent, Qt::WindowFlags f = 0); ^ /usr/include/x86_64-linux-gnu/qt5/QtWidgets/qdialog.h:93:5: note: candidate expects 3 arguments, 1 provided /usr/include/x86_64-linux-gnu/qt5/QtWidgets/qdialog.h:54:14: note: candidate: QDialog::QDialog(QWidget*, Qt::WindowFlags) explicit QDialog(QWidget *parent = 0, Qt::WindowFlags f = 0); ^ /usr/include/x86_64-linux-gnu/qt5/QtWidgets/qdialog.h:54:14: note: conversion of argument 1 would be ill-formed: foo.cpp:11:9: error: uninitialized const member in ‘class QSettings* const’ [-fpermissive] foo(QSettings* const set=nullptr, const QString s="", QWidget *parent=nullptr) : QDialog{ ^ foo.cpp:21:28: note: ‘QSettings* const foo::settings’ should be initialized QSettings * const settings; ^ foo.cpp:12:9: error: expected ‘{’ before ‘public’ public: ,而编译器说:QDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())-令我感到困惑的是,我使用的是错误的头文件吗?

2 个答案:

答案 0 :(得分:2)

您的类foo不继承自QDialog。将第六行更改为:

class foo : public QDialog {

答案 1 :(得分:1)

定义c ++类时,通常的想法是将类方法声明和记录在头文件(.h文件)中,并在cpp文件中实现。我目前在没有编辑器的情况下编写此代码,因此可能会出现一些语法错误,但这会让您朝正确的方向前进:

在h文件中:

#include <QString>
#include <QSettings>
#include <QtWidgets/QWidget>
#include <QtWidgets/QDialog>

class foo : public QDialog 
{
    Q_OBJECT
    public:
        foo(QSettings* const set=nullptr, const QString s="", QWidget *parent=nullptr);
        QString nme_get();
        void qux(); //Removed the void parameter here

    private:
         const QString name;
         QSettings * const settings; 
};

在cpp文件中:

// Or whatever your h file is named
#include "foo.h" 

foo::foo(QSettings* const set=nullptr, const QString s="", QWidget *parent=nullptr)
    :QDialog(parent) {
    // Do constructor stuff here (like initializing name for instance)
}

void foo::nme_get() {
    return name;
}

void foo::qux() {
    QSettings *test = settings;
    QString name = nme_get();
    test->beginGroup(name);
    /*
     * ...
    */
    test->endGroup();
}