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

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

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

C++ Статические массивы
C++ Константные статические объекты класса.
C++ статические и динамические объекты с++
C++ В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты начинают двигаться
Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
05.11.2012, 19:54     Статические объекты #2
Объекты должны определяться в .cpp файле, в .h должны быть только объявления.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11834 / 6813 / 769
Регистрация: 27.09.2012
Сообщений: 16,887
Записей в блоге: 2
Завершенные тесты: 1
05.11.2012, 19:57     Статические объекты #3
Цитата Сообщение от no_wearines Посмотреть сообщение
Но на практике эти правила не действуют (пробовал на C++ Builder 6, Borland C++ 5, Visual C++ 2008)
Всё действует.
Цитата Сообщение от no_wearines Посмотреть сообщение
ИЛИ Я НЕПРАВИЛЬНО ПОНЯЛ?
скорее всего.
no_wearines
 Аватар для no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 322
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;}
Пишет о конфликте имен
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11834 / 6813 / 769
Регистрация: 27.09.2012
Сообщений: 16,887
Записей в блоге: 2
Завершенные тесты: 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;
}
no_wearines
 Аватар для no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 322
05.11.2012, 20:11  [ТС]     Статические объекты #6
и как решается мое первое сообщение и замечаня книг?
что необходимо сделать?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11834 / 6813 / 769
Регистрация: 27.09.2012
Сообщений: 16,887
Записей в блоге: 2
Завершенные тесты: 1
05.11.2012, 20:12     Статические объекты #7
Цитата Сообщение от no_wearines Посмотреть сообщение
и как решается мое первое сообщение и замечаня книг?
что необходимо сделать?
Почитайте про процесс компиляции
no_wearines
 Аватар для no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 322
05.11.2012, 20:55  [ТС]     Статические объекты #8
и все же объясните. Примеров нигде не вижу
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11834 / 6813 / 769
Регистрация: 27.09.2012
Сообщений: 16,887
Записей в блоге: 2
Завершенные тесты: 1
05.11.2012, 20:57     Статические объекты #9
Цитата Сообщение от no_wearines Посмотреть сообщение
и все же объясните. Примеров нигде не вижу
Посмотрите как работают препроцессор и линковщик. Станет все понятно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2012, 21:40     Статические объекты
Еще ссылки по теме:

статические функции C++
C++ Статические библиотеки
C++ Выделение статической памяти, не используя статические объекты

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

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 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
Yandex
Объявления
05.11.2012, 21:40     Статические объекты
Ответ Создать тему
Опции темы

Текущее время: 15:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru