初始化全局变量类

时间:2011-10-27 23:24:09

标签: c++ class

对这样一个基本问题抱歉,但我无法弄清楚。我知道你可以初始化这样一个类:

QFile file("C:\\example");

但是如何从全局变量初始化它呢?例如:

QFile file; //QFile class

int main()
{
    file = ?? //need to initialize 'file' with the QFile class
}

4 个答案:

答案 0 :(得分:11)

1。直截了当的回答

如果课程是可分配/可复制的,你可以写

QFile file; //QFile class

int main()
{
    file = QFile("C:\\example");
}

2。使用间接

如果没有,您将不得不求助于其他选择:

QFile* file = 0;

int main()
{
    file = new QFile("C:\\example");

    //
    delete file;
}

或使用boost::optional<QFile>std::shared_ptr<QFile>boost::scoped_ptr<QFile>

3。使用与单例相关的模式:

由于Static Initialization Fiasco你可能想写这样一个函数:

static QFile& getFile()
{ 
    static QFile s_file("C:\\example"); // initialized once due to being static
    return s_file;
}

C ++ 11也使这样一个函数本地静态初始化线程安全(引用C ++ 0x草案n3242,§6.7:)

enter image description here

答案 1 :(得分:3)

以同样的方式:

// file.cpp

QFile file("C:\\example");

int main()
{
  // use `file`
}

所有全局对象的构造函数在调用main()之前执行(与析构函数相反)。

答案 2 :(得分:1)

#include <iostream>
struct QFile
{
    char const* name;
    QFile(char const* name) : name(name) {}
};

QFile file("test.dat"); // global object

int main()
{
    std::cout << file.name << std::endl;
}

顺便说一下,你写道:

  

我知道你可以初始化一个类

您无法初始化课程。您创建并初始化对象,而不是类。

答案 3 :(得分:1)

完全由你决定是使用全局变量还是其他东西。

对于全局变量,您可以在文件中全局定义它,然后在函数中将其初始化,如下所示,确保正确编写复制构造函数。

QFile file; //class object

int main()
{
    file = QFile("C:\\example"); //create a temporary object and copy it to `file`
}

但是,如果你使用全局指针

会更好
QFile *file;

int main()
{
    file = new QFile("C:\\example");
}

注意,如果仅在文件中使用此全局变量,则可以将其设为static变量。然后它仅限于文件本身。因此,您可以最小化全局变量的错误