2013-05-31 5 views
3

У меня есть переменная в одном из моих классов:Лучшая реализация глобальной переменной

Object * myObject; 

Что я теперь нужны мои другие классы, чтобы иметь возможность доступа к другим классам.

Каким будет самый лучший способ получить к нему доступ?

Является ли следующая реализация правильной?

#ifndef GLOBALS_H 
#define GLOBALS_H 

#include "Object.h" 

Object * myObject[5][5]; 

#endif 

EDIT:

Чуть подробнее, в основном я класс А и класс Б.

класс А имеет переменную MyObject, какой класс B требуется доступ. Класс A также имеет объект класса B, что означает, что я не могу включить заголовок класса A в заголовок класса B, поскольку класс A имеет заголовок include класса B в нем.

+0

Если он уже находится внутри класса, вы можете просто передать объект этого класса везде, где это необходимо. Создайте его в 'main()'. –

ответ

3

Передача ссылки на объект другим заинтересованным классам была бы предпочтительнее. Предполагая, что вы не можете сделать это и в самом деле нужно глобальное, вы бы лучше с

extern Object * myObject; 

в globals.h и

Object * myObject; 

в globals.cpp

В противном случае каждый исходный файл который включает globals.h, выберет дублирующее определение myObject

2

Если все ваши классы используют один и тот же объект, вы можете добавить его в базовый класс как stat переменной.

class base 
{ 
    static Object* myObject; 
}; 

class inherit : base 
{ 
    void foo() 
    { 
     // can access myObject 
    } 
}; 

class inherit2 : base 
{ 
    void bar() 
    { 
     // can access myObject 
    } 
}; 
0

Наиболее социально приемлемым решением для хранения глобальной переменной, безусловно, singleton. Типичная реализация в C++ будет выглядеть следующим образом:

#include <iostream> 
using namespace std; 

class Singleton 
{ 
public: 
     static Singleton& Get() { 
       static Singleton singleton; 
       return singleton; 
     } 

     void DoSomething() { cout << "Something!\n"; } 

private: 
     Singleton() {} 
}; 

int main() 
{ 
     Singleton::Get().DoSomething(); 
} 

Основное преимущество этого более типичной глобальной переменной является то, что у вас есть больше контроля над тем, как строится объект.

Только не забывайте, что это по-прежнему глобальная переменная, поэтому вы должны использовать ее только тогда, когда она является наименее злой альтернативой.

+0

Быстрое замечание об этом: до C++ 11 (vs 2012 и g ++ 4.7, я думаю) это небезопасно в многопоточной среде; для иллюстрации добавьте «Сон (3000); cout << «Завершить построение» << endl; 'в конструкторе Singleton и запустить 3 потока, которые вызывают' Get(). DoSomething() '. Вы увидите «Что-то!» дважды, прежде чем вы увидите сообщение о том, что конструкция выполнена. т. е. вы будете работать с неконструированным объектом! Это разрешено в новом стандарте – Rollie

+0

-1 Синглтоны - это не способ сделать глобальную переменную, это способ обеспечения того, чтобы класс имел только один экземпляр. Лучше использовать статический член или просто глобальный. –

+0

Да, они гарантируют, что у вас есть только один экземпляр вашей глобальной переменной, но это все еще просто своего рода глобальная переменная. Вопрос заключался в том, чтобы запрашивать реализацию глобальных переменных, и вы обманываете себя, если не считаете, что синглтоны принадлежат этому зонтику. –

Смежные вопросы