从任何类访问特定对象

时间:2016-12-27 06:28:20

标签: qt qt5

我正在尝试从另一个类访问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()中初始化一个类吗?

2 个答案:

答案 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)

您有两个选择

  1. awesome的指针或引用传递给Login对象,例如作为Login

  2. 的构造函数的参数
  3. 使用单例模式或全局变量(如S.Pinkus所建议)

  4. 全局变量或单例增加耦合,即Login对象依赖于此特定QtAwesome对象存在。

    将对象传递到使用位置使您可以为每次使用使用特定的QtAwesome对象,或者将其用于多种用法等。

    全局可访问的对象,无论是全局变量还是单例,通常会使测试更加复杂,因为对此类对象的需求不会立即可见,并且同一进程中的所有测试都访问相同的全局访问对象,从而可能导致测试影响每个对象其他意外的方式。