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

Многофайловые программы - C++

Восстановить пароль Регистрация
 
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
06.09.2013, 23:48     Многофайловые программы #1
Доброго времени суток! Объясните пожалуйста почему компилятор в Файле В использует объявление класса some из Файла А для построение объекта ? Ведь каждый исходный файл может иметь свое определение класса
Файл В
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// FILE В 
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
 
class some
{
    int var;
public:
    void init(){ var=111; }
    void show(){cout<<endl<<endl<<"some var "<<var; } 
 
};
 
void func() // Определение и объявление ф-и. С помощью static можно сделать ее невидимой для А
{
    some obj;
    obj.init();        
    obj.show();  //   Результат в консоли " some var 222"
}
и Файл А
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Файл А
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
 
class some
{
    int var;
public:
    void init(){ var=222; }
    void show(){cout<<endl<<endl<<"some var "<<var; } 
 
};
 
void func(); // Достаточно только объявления ф-и
 
void main()
{
    func();
 
    some obj;
    obj.init();   
    obj.show();  //   Результат в консоли " some var 222"
 
    cout<<endl;
    system("pause");
}
Добавлено через 6 минут
Если можно, расскажите как еще можно изменить этот пример что бы подчеркнуть правильное межфайловое взаимодействие для 2 определений классов ?! Как видите у меня программа работает через вызов func() // Файла В из main() // Файла А ???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2013, 23:48     Многофайловые программы
Посмотрите здесь:

C++ Модули. Многофайловые проекты- Помогите пожалуйста.
Многофайловые программы C++
Открытие файла другой программы из программы.Косяк. C++
обясните структуру программы , что выполнняет каждая строчка программы, зараннее благодарен! C++
Ребята, . пожалуйста! Вот текстовые программы. Вообще в строках не соображаю, прошу о .! программы на С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.09.2013, 00:59     Многофайловые программы #2
Цитата Сообщение от ArkTaS Посмотреть сообщение
Ведь каждый исходный файл может иметь свое определение класса
Он и имеет, одного и того же класса.

Добавлено через 10 минут
В файле А и в файле В, определяется один и тот же класс some. Используется то определение, файл с которым компилятор обрабатывает первым (тут - А).
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
07.09.2013, 12:18  [ТС]     Многофайловые программы #3
alsav22, Хорошо, раз так изменим тип переменной var на double в определении в файле В.
В результате имеем тот же вывод some var 222. Что тут можно подумать, что ему все равно какое теперь определение в файле В.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class some
{
    double var;
public:
    void init(){ var=111.1; }
    void show(){cout<<endl<<endl<<"some varB "<<var; } 
 
};
 
void func() // Определение и объявление ф-и. С помощ]ю static можно cделать ее невидимой для А
{
    globalVar=5;
    cout<<endl<<" B globalVar "<<globalVar;
    cout<<endl<<" B stat_var "<<stat_var;
    cout<<endl<<" B const_var "<<const_;
    some obj;
    obj.init(); 
    obj.show(); //   Результат в консоли " some var 222"
}
Раз ему все равно изменим в придачу название метода. В результате он исп. определение класса в файле В и инициализирует var каким то мусором
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class some
{
    double var;
public:
    void init(){ var=111.1; }
    void showB(){cout<<endl<<endl<<"some varB "<<var; } 
 
};
 
void func() // Определение и объявление ф-и. С помощ]ю static можно cделать ее невидимой для А
{
    globalVar=5;
    cout<<endl<<" B globalVar "<<globalVar;
    cout<<endl<<" B stat_var "<<stat_var;
    cout<<endl<<" B const_var "<<const_;
    some obj;
    obj.init(); 
    obj.showB(); //   Результат в консоли " some varB -9.2556e+061"
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.09.2013, 22:46     Многофайловые программы #4
Цитата Сообщение от ArkTaS Посмотреть сообщение
Что тут можно подумать, что ему все равно какое теперь определение в файле В.
Именно. Компилятор смотрит на название класса в файле B. У компилятора уже есть определение класса some, сделанное в файле A, поэтому, повторное определение класса some (по сути - повторное объявление), компилятор просто пропускает. Можете написать там что угодно, это ничего не изменит, пока имя класса будет то же. Исключите файл A из проекта, измените его имя на C и снова добавьте в проект. Теперь первым будет обрабатываться файл B, и начнёт действовать определение класса some, сделанное в этом файле.
Yandex
Объявления
07.09.2013, 22:46     Многофайловые программы
Ответ Создать тему
Опции темы

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