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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2012, 12:42   #1
roll_eyes
Новичок
Джуниор
 
Регистрация: 01.08.2012
Сообщений: 8
По умолчанию путаница со включениями MinGW

Компилятор MinGW
Доброго времени суток господа! Никак не могу разобраться с одной штуковиной. Дело вот в чем... есть 4 модуля (файла):
1 - main.cpp
2 - class_a.hpp
3 - class_b.hpp
4 - object_a.hpp

Затем, я делаю extern class_a object_a в модулях main и class_b. Однако это провацирует ошибку:
"build/Release/MinGW-Windows/main.o:main.cpp.text.startup+0xc) : undefined reference to `object_a`"

Объект object_a является статичным:
#ifndef OBJECT_A_HPP
#define OBJECT_A_HPP
#include "class_a.hpp"
static class_a object_a;
#endif

В общем цель такая - создать класс, использовать один класс для создания глобального объекта (синглтон).

Насколько помню, в других компиляторах такое допустимо. Но MinGW как то рушит все логичное и нелогичное. Если раньше защита типа #ifndef работала в том же borland, то блин в MinGW с этим полный геморой! Поможите добрые люди!
roll_eyes вне форума Ответить с цитированием
Старый 01.08.2012, 13:01   #2
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Может лучше так:
Код:

class Singlton
{
 private:
  Singlton(){}
  float _myData;
public:
 static Singlton& Hinstance()
{
  static Singlton Obj;
  return Obj;

}

float getData(){return _myData}


};
где то в коде программы:
Код:
 float Data = Singlton::Hinstance().getData();
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 01.08.2012, 13:11   #3
roll_eyes
Новичок
Джуниор
 
Регистрация: 01.08.2012
Сообщений: 8
По умолчанию

Про синглтон я утрированно. Смысл не в реализации класса. Смысл в глобальных объектах, которые multiple declaration в случае подключения модуля к нескольким другим модулям. Можно и так записать синглтон, но он будет мультипл в случае если global.hpp я подключу например к двум другим модулям не связанным друг с другом но проецируемых на main в конце.
roll_eyes вне форума Ответить с цитированием
Старый 01.08.2012, 13:20   #4
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Цитата:
но он будет мультипл
Нет, не будет.
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 01.08.2012 в 13:25.
Krok27 вне форума Ответить с цитированием
Старый 01.08.2012, 13:31   #5
roll_eyes
Новичок
Джуниор
 
Регистрация: 01.08.2012
Сообщений: 8
По умолчанию

:D Блин, мы не моняли друг друга. Ваш пример не будет. Но дело не в синглтоне. Дело в инклудах. Ладно, забудем про синглтон. Имеется глобальный namespace скажем так, в котором есть несметное кол-во static переменных. Они должны быть видимыми во всех участках программы. Сам namespace описан в отдельном хедере. Там же в этом хедере и дефолтные (нулевые скажем так) объекты, начала всех начал... но это опустим. Сконцентрируемся на переменных. Есть масса переменных, которые должны быть видимы во всех участках программы (в произвольных).
roll_eyes вне форума Ответить с цитированием
Старый 01.08.2012, 13:40   #6
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Почему же?
Цитата:
В общем цель такая - создать класс, использовать один класс для создания глобального объекта (синглтон).
Ну да ладно.
А object_a.hpp включен в main.cpp?
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 01.08.2012 в 13:56.
Krok27 вне форума Ответить с цитированием
Старый 01.08.2012, 13:56   #7
roll_eyes
Новичок
Джуниор
 
Регистрация: 01.08.2012
Сообщений: 8
По умолчанию

Krok27, ну в первом же сообщении написано Похоже на троллинг, но буду надеяться на лучшее. Да обжект_а включен в более чем один хедер. И не смотря на #ifndef появляется мультипл декларашн
roll_eyes вне форума Ответить с цитированием
Старый 01.08.2012, 14:01   #8
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Судя по ошибке, о мультидекларации речи не идет:
Цитата:
"build/Release/MinGW-Windows/main.o:main.cpp.text.startup+0xc) : undefined reference to `object_a`"
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 01.08.2012, 14:06   #9
roll_eyes
Новичок
Джуниор
 
Регистрация: 01.08.2012
Сообщений: 8
По умолчанию

Не идет, не идет. В первом сообщении, миновал мультипл декларашн как отыгранный факт и описал проблемы с экстерном. Тем не менее, вопрос именно об инклудах, название темы "путаница со включениями MinGW" Вы можете мне помочь? Я вроди уже в достаточной мере уточнил вопрос. Вы не подумайте, я не хамлю, но если у вас нет желания отвечать, то в общем то, зачем лишний раз напрягаться тогда А если я что не ясно сказал, могу в общем переозвучить вопрос на новый лад. Вопрос в следующием:
Имеется 4 хедера
1 - main.cpp
2 - class_a.hpp и cpp
3 - class_b.hpp и cpp
4 - object_a.hpp
Вариант 1
В 4м модуле имеется static class_a object_a
В 1 и 3 модулях имеется #include "object_a.hpp"
результат: многовызов конструктора.

Вариант 2
аналогичен первому, но object_a не static.
результат: мультипл декларайшен

Вопрос
Каким чудом надо в MinGW сделать хедер с глобальными объектами, что бы тот был доступен в произвольных местах в программе.

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

Так же, к слову об неадекватности MinGW - вот такой пример описанный последним сообщением в этом форуме, он так же провацирует мультиплдекларайшн, даже не смоторя на #ifndef #define
http://www.cyberforum.ru/cpp-beginne...ead295050.html -> это как пример, в какую область мыслить.

Последний раз редактировалось roll_eyes; 01.08.2012 в 14:40.
roll_eyes вне форума Ответить с цитированием
Старый 01.08.2012, 19:27   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Каким чудом надо в MinGW сделать хедер с глобальными объектами, что бы тот был доступен в произвольных местах в программе.
глобальные объекты должны быть объявлены как extern
rrrFer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка списка прямыми включениями (вставками) gary jules Помощь студентам 0 30.05.2012 20:09
Метод сортировки (простыми включениями) Alexander7 Помощь студентам 2 18.05.2012 16:27
Путаница с While и If Drozd-A Помощь студентам 2 14.10.2011 17:00
Путаница с типами для больших строк WennY Общие вопросы Delphi 5 02.09.2011 06:27
Путаница в формах в Delphi TaYgA Помощь студентам 2 26.10.2009 19:51