对这样一个基本问题抱歉,但我无法弄清楚。我知道你可以初始化这样一个类:
QFile file("C:\\example");
但是如何从全局变量初始化它呢?例如:
QFile file; //QFile class
int main()
{
file = ?? //need to initialize 'file' with the QFile class
}
答案 0 :(得分:11)
如果课程是可分配/可复制的,你可以写
QFile file; //QFile class
int main()
{
file = QFile("C:\\example");
}
如果没有,您将不得不求助于其他选择:
QFile* file = 0;
int main()
{
file = new QFile("C:\\example");
//
delete file;
}
或使用boost::optional<QFile>
,std::shared_ptr<QFile>
,boost::scoped_ptr<QFile>
等
由于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:)
答案 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
变量。然后它仅限于文件本身。因此,您可以最小化全局变量的错误。