我正在尝试从另一个类访问awesome
个对象。我在main()
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QtAwesome* awesome = new QtAwesome(&app);
awesome->initFontAwesome();
app.setWindowIcon(awesome->icon( "clipboard" ));
Login w;
w.show();
return app.exec();
}
现在如何从awesome
或任何其他类访问Login
个对象?如果我想从另一个类访问,最好在main()
中初始化一个类吗?
答案 0 :(得分:3)
在main()中声明awesome
使其作用域为main()函数,因此只能从main()中看到,或者您从main()明确地传递它的函数。
实现所需内容的简单方法是使用"外部变量":将定义和声明放在主{c}的main()
之外:
<强> main.cpp中:强>
QtAwesome * awesome = new QtAwesome(&app);
int main(int argc, char *argv[]) {
awesome->do_something();
// ...
}
以上称为&#34; awesome&#34;的定义声明。在您想要使用的其他文件中,使用extern
存储说明符:
<强> somerandommodule.cpp:强>
extern QtAwesome * awesome;
void some_function() {
awesome->do_something();
}
重要的是你只有一个&#34;定义声明&#34;。链接器将使所有extern
令人敬畏的声明指向这个定义。
如果您是编写QtAwesome类的人,另一种方法是将单个实例保留在QtAwesome类中。这大致是&#34;单身模式&#34;。这样可以更容易地判断初始化发生的位置和时间:
<强> qtawesome.h:强>
class Awesome {
private:
static Awesome * singleton;
public:
static Awesome * getInstance() {
if(!Awesome::singleton)
Awesome::singleton = new Awesome();
return Awesome::singleton;
};
};
<强> qtawesome.cpp:强>
#include "awesome.h"
Awesome* Awesome::singleton = 0;
<强> somerandommodule.cpp:强>
#include "awesome.h"
void some_function() {
Awesome::getInstance()->do_something();
}
答案 1 :(得分:2)
您有两个选择
将awesome
的指针或引用传递给Login
对象,例如作为Login
使用单例模式或全局变量(如S.Pinkus所建议)
全局变量或单例增加耦合,即Login
对象依赖于此特定QtAwesome
对象存在。
将对象传递到使用位置使您可以为每次使用使用特定的QtAwesome
对象,或者将其用于多种用法等。
全局可访问的对象,无论是全局变量还是单例,通常会使测试更加复杂,因为对此类对象的需求不会立即可见,并且同一进程中的所有测试都访问相同的全局访问对象,从而可能导致测试影响每个对象其他意外的方式。