Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2009, 18:15   #1
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию Статические обекты в .h файле

Мне в одной программе нужно было иметь что-то типа уникальных глобальных переменных-объектов классов, доступных из разных мест. В итоге я в описаниях классов, в h-файлах, добавил статические функции, возвращающие ссылки на статические объекты классов. Примерно как показано ниже:

class CClass
{
static CClass& GetStaticClass() { static CClass c; return c; }
};

И все у меня прекрасно работало.

Потом данную технологию увидел другой человек и сказал, что так делать нельзя. Типа если в заголовочном файле подобным образом объявлять переменные, то они могут насоздаваться в количестве нескольких штук, из-за того, что этот заголовочный файл используется в нескольких cpp-файлах.
Понятно, что можно перенести реализацию функции вместе с объектом в соответствующие cpp-файлы, и вопроса не будет. Но лично у меня никаких глюков с описанием в h-файле не возникало, и мне стало интересно - правда ли то, что он сказал, или нет?

Собственно, может кто-нибудь точно сказать, возможно ли создание нескольких объектов при подобной технологии?
Pashan вне форума Ответить с цитированием
Старый 18.03.2009, 18:38   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

чтобы избежать подключения h-файлов несколько раз делают так

Код:
#ifndef _file_h_
          #define _file_h_
          #pragme once
        . . .
           #endif
counter вне форума Ответить с цитированием
Старый 18.03.2009, 18:43   #3
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Да, это все там стоит, я про это тоже говорил. Но человек утверждал, что типа при компиляции все равно эти файлы могут несколько раз обрабатываться.
Например, если в h-файл засунуть ошибку, про нее будет писаться при компиляции каждого cpp-файла, каторый его использует.
Pashan вне форума Ответить с цитированием
Старый 18.03.2009, 19:15   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

при объявлении переменной-члена класса она является общей для всех объектов данного типа

http://msdn.microsoft.com/ru-ru/libr...xd(en-us).aspx
counter вне форума Ответить с цитированием
Старый 18.03.2009, 22:41   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Лучше посмотрите на различные реализации паттерна Одиночка (Singleton) и выбирайте что по душе.Хотя, может я просто не люблю статические переменные в функциях/методах
pu4koff вне форума Ответить с цитированием
Старый 18.03.2009, 23:02   #6
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

pu4koff, спасибо, термин Singleton до этого не видел. Собственно, у меня нет вопроса в том, как делать. Сделать можно десятью способами. Просто интересно было, как оно в реальности работает.
Pashan вне форума Ответить с цитированием
Старый 19.03.2009, 00:04   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Может знакомый ваш имел ввиду, что такое описание метода класса автоматически делает его inline и соответственно все его вызовы, при компиляции, будут заменены телом? Так что я бы тут не стал ручаться, что не появится несколько статических переменных. Мало ли что там в компиляторах намудрили Лучше так не писать всёже и вынести статическую переменную из метода в класс.
pu4koff вне форума Ответить с цитированием
Старый 19.03.2009, 00:11   #8
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Кстати, посмотрел в википедии про singleton. Там есть такой пример:
Код:
 template<typename T> class Singleton
 {
    public:
     static T& Instance()
     {
         static T theSingleInstance;
         return theSingleInstance;
     }
 };
 
 class OnlyOne : public Singleton<OnlyOne>
 {
     //...
 };
Собственно, тут написано примерно то же, что я написал, только через шаблон. И, видимо, работает оно нормально.
Pashan вне форума Ответить с цитированием
Старый 19.03.2009, 00:42   #9
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

В Singleton-не конструктор и деструктор должны быть в private
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 19.03.2009, 09:21   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Основное назначение примеров в вики - это показать идею, а не предоставить готовый код. Кроме того, в вики пример на шаблоне, а описание и реализация шаблонов должны быть в одном модуле, т.е. в *.cpp файл уже не вынесешь ничего.
Вот, кажется, Ваш случай: Креш в синглтоне Мейерса
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
БД в файле vitamin.rulez Помощь студентам 2 28.01.2009 17:20
Позиция в файле на си Mixasik Помощь студентам 26 27.11.2008 01:13
Поиск в файле Zandrey Microsoft Office Excel 8 05.09.2008 12:23
матрица в файле Mapина Помощь студентам 9 04.07.2007 10:27
Неменяемые обекты ZhekON Общие вопросы Delphi 5 09.04.2007 13:43