Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глобальный объект 
:(
    Опции темы
Yulo
Дата 26.5.2012, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 10.4.2008

Репутация: нет
Всего: нет



Я хочу сделать глобальный объект доступный в любом месте программы.

В одном файле:

myType* mt

в остальных

extern myType* mt

запускаю под дебагером(VC 2010)

вначале инициализирую указатель:

mt=new myType;

в файлах(где extern), при входе дебагером, указатель mt равен нулю.

еще странность,

mt=01ff5f20

при входе в функцию mt->func()

this равен 01ff6000


?!!!

давно не программировал на С++




PM MAIL   Вверх
boostcoder
Дата 26.5.2012, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



используй синглтон.
PM WWW   Вверх
Yulo
Дата 26.5.2012, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 10.4.2008

Репутация: нет
Всего: нет



спасибо, буду смотреть синглтон.

Все-таки хотелось бы понять, если есть

extern myType* my;

разве он не должен указывать на тотже объект?
PM MAIL   Вверх
mes
Дата 26.5.2012, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Yulo @  26.5.2012,  15:10 Найти цитируемый пост)
разве он не должен указывать на тотже объект? 

должен


--------------------
PM MAIL WWW   Вверх
volatile
Дата 26.5.2012, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(Yulo @  26.5.2012,  16:10 Найти цитируемый пост)
разве он не должен указывать на тотже объект? 

Должен, то должен. Только порядок выполнения модулей неопределён.
Например в 1 файле:
Код

myType * mt = new myType;
int a =  mt->func(); // здесь mt создан, все нормально.

Во 2-ом файле:
Код

extern myType* mt;
int a =  mt->func(); // А вот здесь, неопределено. Объект может быть уже создан, а может еще и нет. (зависит от порядка линковки)
                     // Это UB!  Так писать нельзя.

PM MAIL   Вверх
AndrewMT
Дата 31.5.2012, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 31.5.2012

Репутация: нет
Всего: нет



Не совсем понял Вас.
Вообще, делается так:

в неком файл1.срр определяете тип myType, в файле1.h пишете просто объявление
типа myType с ключевым словом extern (буквально так:  extern myType;  )

а потом файл1.h подключаете к тем модулям, где тип myType используется.
PM MAIL   Вверх
volatile
Дата 1.6.2012, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(AndrewMT @  31.5.2012,  11:27 Найти цитируемый пост)
Не совсем понял Вас.

Это вы кого не поняли?
если меня, то от вашего 
Цитата(AndrewMT @  31.5.2012,  11:27 Найти цитируемый пост)
файле1.h

ровным счетом ничего не изменится.
Код

#include "файле1.h"
int a =  mt->func(); // А вот здесь, неопределено. Объект может быть уже создан, а может еще и нет. (зависит от порядка линковки)
                     // Это UB!  Так писать нельзя.



PM MAIL   Вверх
math64
Дата 1.6.2012, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Нужно так:
Код

// mytype.h
class mytype {
public:
int func();
};
extern mytype* mt;
// main.cpp
#include "mytype.h"
#include "other.h"
mytype* mt;
int main (int argc, char** argv) {
mt = new mytype;
f ();
}
// other.h
void f();
// other.cpp
#include "other.h"
#include "mytype.h"
void f() {
int a = mt->func();
}

или использовать синглетон.
PM   Вверх
volatile
Дата 1.6.2012, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(math64 @  1.6.2012,  09:44 Найти цитируемый пост)
void f() {
int a = mt->func();
}

math64, там имелось ввиду (а) глобальное, такое же (mt), и как название этой темы.  smile 
Локальное 'а', естественно будет работать, даже без дополнительных ухищрений.

PM MAIL   Вверх
math64
Дата 3.6.2012, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Цитата(volatile @  1.6.2012,  13:27 Найти цитируемый пост)
math64, там имелось ввиду (а) глобальное, такое же (mt), и как название этой темы.  smile 
Локальное 'а', естественно будет работать, даже без дополнительных ухищрений.

Так я и показываяю, как объявить глобальную переменную (mt)
extern mytype* mt; - в загловке mytype.h
mytype* mt; - в main.cpp
mt = new mytype; - инициализация в начале main();
int a = mt->func(); - использование в f(), вызванной после иницализации переменной.
Если a - глобальная переменная, её нельзя инициализировать при объявлении, а только после инициализации mt (ну и ползоваться ею можно будет только после инициализации)
Использование синглетона (при усповии однонитевого приложения):
Код

// mytype.h
class mytype {
public:
int func();
static mytype* mt();
};
// mytype.cpp
#include "mytype.h"
mytype* mytype::mt() {
static mytype* _mt = 0;
if (_mt == 0) _mt = new mytype;
return _mt;
}
// other.cpp
#include "mytype.h"
void f() {
int a = mytype::mt()->func();
}


PM   Вверх
volatile
Дата 3.6.2012, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(math64 @  3.6.2012,  10:30 Найти цитируемый пост)
Если a - глобальная переменная, её нельзя инициализировать при объявлении

Ну почему-же? Очень даже можно:

Цитата(volatile @  26.5.2012,  22:44 Найти цитируемый пост)
myType * mt = new myType;
int a =  mt->func(); // здесь mt создан, все нормально.


Цитата(math64 @  3.6.2012,  10:30 Найти цитируемый пост)
 а только после инициализации mt 

Да, только после инициализации mt



PM MAIL   Вверх
volatile
Дата 3.6.2012, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Насчет неопределенности, видимо я не смог изложить правильно, или ... в общем мне кажется меня не понимают.
Еще один пример того что я хотел сказать:

файл1.cpp
Код
int a = printf ("O");

файл2.cpp
Код
int b = printf ("K");

файл3.cpp
Код
extern int a, b;
int main () 
  { return a+b; }

Внимание вопрос что напечатает прога ?
Определенно, она напечатает одно из двух, либо "OK", либо "KO", но вот что именно ?!?

Подсказка: Это вопрос, к новичкам, чтобы задумались, а не к экспертам, чтобы давать на него всем очевидные решения, типа:
пиши
Код
int main() { printf ("OK"); }
, детка и нет проблем!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0597 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.