О великие гуру программирования помогите новичку разобраться!!!
есть структура
struct St{
int a;
int b;
};
определенная в отдельном хидере
нужен массив:
St array[6];
но чтоб его видели и могли его использовать разные классы(модули), тоесть что-то типа глобального массива, я знаю что глобальность — зло, но мене всеравно,
как? и в камом месте? инициализировать этот массив
Здравствуйте, Shpil, Вы писали:
S>О великие гуру программирования помогите новичку разобраться!!!
S>есть структура
S>struct St{ S>int a; S>int b; S>};
S>определенная в отдельном хидере
S>нужен массив:
S>St array[6];
S>но чтоб его видели и могли его использовать разные классы(модули), тоесть что-то типа глобального массива, я знаю что глобальность — зло, но мене всеравно,
S>как? и в камом месте? инициализировать этот массив
Здравствуйте, Shpil, Вы писали:
S>есть структура
S>struct St{ S>int a; S>int b; S>};
S>определенная в отдельном хидере
S>нужен массив:
S>St array[6];
S>но чтоб его видели и могли его использовать разные классы(модули), тоесть что-то типа глобального массива, я знаю что глобальность — зло, но мене всеравно,
S>как? и в камом месте? инициализировать этот массив
синглетон тебе в помощь. где-то так:
struct St{
int a;
int b;
static St * global () {
static St array[6] = {...};
return array;
}
};
Здравствуйте, Аноним, Вы писали:
А>От: valker А>издеваетесь???
А>От: night beast
А>такая функция возврашает указатель на массив, ок
А>St *array_pointer = array::global();
А>но в указателе только первый элемент массива
А> array_pointer->a ; А> array_pointer->b ;
А>а как же быть с осташльными элементами???
Гневное выступление, ничего не скажешь
А то что к указателю, равно как и к массиву, применима операция индексирования [] Вам известно?
А>и что за синглетон??
Синглетон — это название паттерна.
Предвижу, что за этим последует вопрос "а что за паттерн?".
Поэтому отвечаю сразу: читайте книжку Гамма "Паттерны проектирования".
--
Справедливость выше закона. А человечность выше справедливости.
По-моему, в h-файле нужно написать
struct St{
int a;
int b;
};
extern St array[6]; // это декларация массива в h-файле, чтобы он был виден во всех cpp, в которые включён данный h-файл.
// extern говорит, что массив только декларируется, а не создаётся, что предотвращает создание массивов-дупликатов во всех cpp-файлах, в которые включён h-файл
А в одном из cpp-файлов нужно действительно создать эту переменную-массив:
V>пихать можно в любой хедер (в прекомпайлед пихать и надо), но один раз, поентому поставь в начало #pragma once
Вариант со 'static' создаст отдельную копию объявляемого объекта в каждой единице компиляции. Человеку же нужен глобальный объект, т.е. один единственный объект, разделяемый всеми единициами компиляции.
Здравствуйте, Андрей Тарасевич, Вы писали:
S>>>как? и в камом месте? инициализировать этот массив V>>static NULL_TYPE& Null = *(NULL_TYPE*)(NULL); АТ>Вариант со 'static' создаст отдельную копию объявляемого объекта в каждой единице компиляции. Человеку же нужен глобальный объект, т.е. один единственный объект, разделяемый всеми единициами компиляции.
я проверял, не создаёт: V>>static NULL_TYPE& Null = *(NULL_TYPE*)(0xFFAAFFAA);
сделал 3 *.cpp и в DEBUG в исполняемом файле ни одного вхождения 0xAAFFAAFF,
также если поместить по функции которая просто возвращает Null в каждый cpp и по всем их возвращаемым значениям вывести на печать адресс Null, то везде выведеться 0, что ещё нужно?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
огромное спасибо всем ответевшим!, в итоге действительно помог сингелтон, варианты с #extern и #pragma once я пробывал до того как тему запостил, экстерн наверное просто использовать правильно не умею, а вот с #pragma once не в какую не работал, линкер настойчиво показывал ошибки повторной декларации в разных файлах, но главное все получилось.
Здравствуйте, Rothmans, Вы писали:
R>А, простите, зачем static в определении глобальной переменной?
When modifying a variable or function at file scope, the static keyword specifies that the variable or function has internal linkage (its name is not visible from outside the file in which it is declared).
Это означает, что переменная, объявленная как static на уровне файла (а не функции или класса), будет уникальна для каждого транслируемого модуля, в котором будет встречаться ее объявление. По-другому можно сказать, что каждый транслируемый модуль будет иметь собственную копию эту переменной. Иногда это действительно помогает избежать ошибок линкера (о множественном определении переменной), но насколько я знаю, его использование в C++ нежелательно. Как правило аналогичного поведения можно добиться с помощью анонимных пространств имен.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Здравствуйте, ekamaloff, Вы писали:
E>Это означает, что переменная, объявленная как static на уровне файла (а не функции или класса), будет уникальна для каждого транслируемого модуля, в котором будет встречаться ее объявление. По-другому можно сказать, что каждый транслируемый модуль будет иметь собственную копию эту переменной. Иногда это действительно помогает избежать ошибок линкера (о множественном определении переменной), но насколько я знаю, его использование в C++ нежелательно. Как правило аналогичного поведения можно добиться с помощью анонимных пространств имен.