2016-12-27 5 views
0

Я пытаюсь получить доступ к объекту 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(), если я хочу получить доступ из другого класса?

ответ

3

Объявление awesome в main() делает его областью действия к функции main() и, следовательно, видимо только с помощью функции main() или функций, которые вы явно передаете в main().

Простой способ добиться того, что вы хотите использовать «внешнюю переменную»: Поместите определение и объявление за пределами main() в основной исполняемый файл:

main.cpp:

QtAwesome * awesome = new QtAwesome(&app); 

int main(int argc, char *argv[]) { 
    awesome->do_something(); 
    // ... 
} 

Вышеупомянутое называется определяющим объявлением «awesome». В других файлах, которые вы хотите использовать в удивительном, используйте спецификатор extern хранения:

somerandommodule.cpp:

extern QtAwesome * awesome; 

void some_function() { 
    awesome->do_something(); 
} 

Очень важно, что у вас есть ровно один «определяющая декларация». Компонент сделает все extern удивительные объявления указывают на это определение.


Если вы один письменном класс QtAwesome, еще один способ сделать это держит единственный экземпляр в классе QtAwesome. Это примерно «одноэлементный рисунок». Это просто делает его легче сказать, где и когда инициализация происходит:

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(); 
} 
2

У вас есть два варианта

  1. передать указатель или ссылку на awesome к Login объекта, например, в качестве аргумента конструктора Login

  2. использовать одноэлементный шаблон или глобальные переменный (как это было предложено S.Pinkus)

глобальные переменные или одноэлементный увеличивает сцепление, т.е. Login объекта становится зависимым на этом конкретном объекте QtAwesome существует.

Передача объекта в местах использования позволяет использовать определенный QtAwesome объект для каждого использования или использовать то же самое для многоразового использования и т.д.

Глобально доступные объекты, будь то глобальные переменные или одиночек, часто делают тестирование более сложно, поскольку потребность в таком объекте не сразу видна, и все тесты в рамках одного процесса обращаются к одному глобально доступному объекту, что потенциально приводит к неожиданным результатам, которые влияют друг на друга.