【问题标题】:Initialization of non-primitive static data type within class in C++C++类中非原始静态数据类型的初始化
【发布时间】:2012-05-03 10:47:15
【问题描述】:
#include <QQueue>
#include <QString>

class   Util {
public:

    static QQueue<QString> links;

    Util() {
    }
};

    Util::links.enqueue("hello world");

我该怎么做?

【问题讨论】:

标签: c++ qt class static-members


【解决方案1】:

你可以用函数的结果来初始化它:

QQueue<QString> make_links() {
    QQueue<QString> queue;
    queue.enqueue("hello world");
    return queue;
}

QQueue<QString> Util::links = make_links();

我不熟悉 QT,但可能希望他们添加对 C++11 初始化列表的支持,在这种情况下,您可以将其初始化为:

QQueue<QString> Util::links {"hello world"};

(更新:根据 Shahbaz 评论中的链接,如果您使用 C++11,您确实可以这样做)。

【讨论】:

    【解决方案2】:

    尝试使用静态成员函数:

    #include <QQueue>
    #include <QString>
    
    class   Util {
    public:
    
        static QQueue<QString>& links() {
          static QQueue<QString> instance;
          static bool is_init = false;
          if(!is_init) {
            instance.enqueue("hello world");
            is_init = true;
          }
          return instance;
        }
    
        Util() {
        }
    };
    

    在 C++11 中,QQueue 似乎支持初始化列表,正如 Shahbaz 所说:

    QQueue<QString> Util::links = {"hello world"};
    

    【讨论】:

    • 在多线程程序中,您需要确保在允许多个线程访问它之前对其进行初始化。静态对象没有这个问题。
    • @MikeSeymour 是的,静态成员函数不是很好的解决方案。
    【解决方案3】:

    您可以在所有此类情况下使用静态初始化对象:

    头文件:

    #include <QQueue>
    #include <QString>
    
    class   Util {
    public:
    
        static QQueue<QString> links;
    
        Util() {
        }
    };
    

    cpp 文件:

    namespace {
        struct StaticInitializer {
            StaticInitializer() {
                Util::links.enqueue("hello world");
            }
        } initializer;
    }
    

    【讨论】:

      【解决方案4】:

      你像往常一样在全局范围内初始化:

      QQueue<QString> Util::links;
      

      QQueue<QString> Util::links(1); // with constructor parameters if necessary
      

      【讨论】:

      • 除了"hello world" 不存在!另外,QQueue 没有那个构造函数
      猜你喜欢
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多