初始化全局变量类

12

非常抱歉这是一个基础问题,但我无法理解。我知道可以像这样初始化一个类:

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

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

QFile file; //QFile class

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

顺便提一下,全局变量是不好的主意。 - Etienne de Martel
你不会初始化一个类,而是初始化一个实例。请考虑为什么你需要一个全局变量,因为通常情况下,你并不需要它。 - Fred Foo
4个回答

20

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 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


没有 std::scoped_ptr 这样的东西,似乎你看起来像 30k 的先生 ;-) - Kerrek SB
2
@mloskot:添加了标准参考 - sehe
@sehe 哈哈,辛苦了,谢谢。可以注明段落号。 - mloskot
@sehe,你在全局范围内使用完全相同的语法选项,这是唯一合理的选择,但你却没有这样做。 - std''OrgnlDave
静态初始化问题的链接已经失效(2015年7月):这个链接似乎可以使用:http://www.parashift.com/c++-faq/static-init-order.html - CarlH
显示剩余2条评论

4
同样的方式:
// file.cpp

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

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

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

哪个是正确答案(对于非C++1y)?如果您的类没有平凡的初始化程序,则这是唯一可能的方法。 - mousomer

2
#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;
}

顺便提一句,你写道:

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

你不能初始化一个类。你创建和初始化对象,而不是类。


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变量。然后它仅限于文件本身。因此,您可以最小化全局变量的不良影响

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接