Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 324
#1

Статические объекты - C++

05.11.2012, 19:37. Просмотров 1127. Ответов 9
Метки нет (Все метки)

Статические объекты имеют область действия файл.
Тобиш если я в одном файле определю глобальный статический объект, подключу другой файл например типа *.h с определенными там одноименными глобальными статическими объектами, то для каждого файла должны быть созданы отдельные объекты и не должно быть конфликта имен (ТАК Я ПОНЯЛ).
Второй случай: в одном файле определены глобальные статические объекты. По идее другие файлы недолжны их видеть (ТАК Я ПОНЯЛ). Да и в книгах тоже написано.
Но на практике эти правила не действуют (пробовал на C++ Builder 6, Borland C++ 5, Visual C++ 2008)
ИЛИ Я НЕПРАВИЛЬНО ПОНЯЛ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2012, 19:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Статические объекты (C++):

Статические и динамические объекты - C++
Используя объекты, классы, конструкторы и деструкторы необходимо разработать программу по следующим заданиям. Создать динамический массив...

Константные статические объекты класса. - C++
Здравствуйте. Есть класс "матрица" нужно задать константные матрицы такие как E - единичная матрица и т.д., как это сделать? #include...

Выделение статической памяти, не используя статические объекты - C++
Здравствуйте! Как известно, когда мы объявляем статическую переменную, то компилятор выделяет ей место с самого начала, т. е....

Можно ли добавлять статические объекты классов в STL контейнеры? - C++
Или обязательно добавлять ссылки на них в контейнер? Нигде не могу найти ответа.

Как правильно объявлять статические константные объекты в классе? - C++
В классе надо объявить статичные константные строки. Типа class A { public: static const std::string OLOLO = "ololo"; } Но так...

Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты? - C++
Вопрос прост: как при выходе из функции сохранить объекты, которые были созданы в данной функции (указатели объектов положены в массив)?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
05.11.2012, 19:54 #2
Объекты должны определяться в .cpp файле, в .h должны быть только объявления.
0
Croessmah
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 1
05.11.2012, 19:57 #3
Цитата Сообщение от no_wearines Посмотреть сообщение
Но на практике эти правила не действуют (пробовал на C++ Builder 6, Borland C++ 5, Visual C++ 2008)
Всё действует.
Цитата Сообщение от no_wearines Посмотреть сообщение
ИЛИ Я НЕПРАВИЛЬНО ПОНЯЛ?
скорее всего.
0
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 324
05.11.2012, 20:06  [ТС] #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <conio.h>
#include "q.h"
using namespace std;
 
static int q;
 
int main()
{
    
    getch();
    return 0;
}
 
//q.h
static int q = 43;
static int f_1() {return 1;}
Пишет о конфликте имен
0
Croessmah
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 1
05.11.2012, 20:09 #5
естевственно. У вас же фаил q.h встроитвя в main.cpp. После работы препроцессора на вход компилятору попадет что-то вроде этого:
и будет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
фаил iostream.h
фаил conio.h
//Содержимое файла q.h
static int q = 43;
static int f_1() {return 1;}
using namespace std; 
static int q;//<-а тут переопределение
 
int main()
{
    
    getch();
    return 0;
}
0
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 324
05.11.2012, 20:11  [ТС] #6
и как решается мое первое сообщение и замечаня книг?
что необходимо сделать?
0
Croessmah
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 1
05.11.2012, 20:12 #7
Цитата Сообщение от no_wearines Посмотреть сообщение
и как решается мое первое сообщение и замечаня книг?
что необходимо сделать?
Почитайте про процесс компиляции
0
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 324
05.11.2012, 20:55  [ТС] #8
и все же объясните. Примеров нигде не вижу
0
Croessmah
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 1
05.11.2012, 20:57 #9
Цитата Сообщение от no_wearines Посмотреть сообщение
и все же объясните. Примеров нигде не вижу
Посмотрите как работают препроцессор и линковщик. Станет все понятно.
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.11.2012, 21:40 #10
Цитата Сообщение от no_wearines Посмотреть сообщение
и все же объясните. Примеров нигде не вижу
Компилятор фактически компилирует следующий файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[[содержимое iostream]]
[[содержимое conio.h]]
 
// [[содержимое q.h]]
static int q = 43;
static int f_1() {return 1;}
 
using namespace std;
 
static int q;
 
int main()
{
    
    getch();
    return 0;
}
Не удивительно, что всё конфликтует.

Чтобы "всё действовало", берёте один файл:
C++
1
2
3
4
5
6
7
8
9
10
// 1.cpp
static int func1()
{
    return 1;
}
 
int func2()
{
    return 2 * func1();
}
А потом пытаетесь собрать его вместе со вторым:
C++
1
2
3
4
5
6
7
8
9
10
// 2.cpp
#include <iostream>
 
int func1();
int func2();
 
int main()
{
    std::cout << func1() << " " << func2();
}
Он откомпилируется, но линкер вас обругает, что вы ему не выдали функцию func1(). func2() же экспортируется файлом 1.cpp
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2012, 21:40
Привет! Вот еще темы с ответами:

В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты начинают двигаться - C++
В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты...

статические массивы - C++
Дана ценлочисленная прямоугольная матрица. Определитть номер первого из столбцов, содержащих хотя бы один нулевой элемент. ...

Статические библиотеки - C++
Как создать статическую библиотеку? Использую в турбо с. Я чего-то не то делаю? Создала файл LIB.H с кодом #ifndef MY_COOL_LIBRARY...

Статические массивы - C++
Перевести в веденой строке все буквы из нижнего регистра в верхний?? Пожалуйста помогите!!! Добавлено через 56 секунд Пожалуйста!!!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.11.2012, 21:40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru