【问题标题】:Can we define static class member inside constructor? [duplicate]我们可以在构造函数中定义静态类成员吗? [复制]
【发布时间】:2017-06-04 01:49:18
【问题描述】:

假设我在头文件中定义了一个静态成员,例如:

static QHash<QString,int> flagColorsMap;

如何在 cpp 文件中的构造函数中定义 hashmap。如果我执行以下操作:

Classname::flagColorsMap.insert("xyz",22);

它给出了编译错误 :: undefined reference to Classname::flagColorMap.

【问题讨论】:

  • 你初始化flagColorsMap了吗?
  • 这是一个链接器错误。尝试在一个且只有一个源文件中添加QHash&lt;QString,int&gt; Classname::flagColorsMap 来定义静态成员,该源文件具有类定义的可见性(例如包含)。
  • 你为什么使用类限定符?
  • 那么您不知何故误解或误用了我的建议。您随后接受的答案的实质(由于您还说它“不起作用”而对其进行了编辑)是相同的建议,并且编辑只是一个示例。
  • @Peter 我完全同意你的看法。我收回我之前的声明。

标签: c++ qt static hashmap


【解决方案1】:

我认为你得到这个编译错误是因为你只是“delcare”flagColorsMap 而不是“定义”它。 所以在.cpp文件中定义flagColorsMap也许这个错误就会消失。

【讨论】:

    【解决方案2】:

    在 .cpp 文件中放入这一行:

    QHash<QString,int> Classname::flagColorsMap;
    

    编辑: 请检查这个非常简单的静态 QHash 成员初始化示例:创建新的 Qt Quick 项目并编辑 MainWindow 类:

    // mainwindow.h
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private:
        Ui::MainWindow *ui;
        static QHash<QString,int> flagColorsMap;
    
    };
    
    #endif // MAINWINDOW_H
    

    还有源文件:

    // mainwindow.cpp
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QDebug>
    
    QHash<QString,int> MainWindow::flagColorsMap;
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        MainWindow::flagColorsMap.insert("xyz",22);
    
    }
    
    MainWindow::~MainWindow()
    {
        qDebug() << "Value=" << flagColorsMap.value("xyz");
        delete ui;
    }
    

    还是不行吗?

    【讨论】:

    • 这不起作用。
    • 你能提供更多的代码吗?这样的初始化对我有用。
    • 你还没有做任何初始化。
    • 我在做的是QHash Classname::flagColorsMap.insert("xyz",22);
    • @Sumeet Singh:请看我编辑的答案。
    猜你喜欢
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多