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

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

Войти
Регистрация
Восстановить пароль
 
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
#1

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

06.09.2013, 23:48. Просмотров 492. Ответов 3
Метки нет (Все метки)

Доброго времени суток! Объясните пожалуйста почему компилятор в Файле В использует объявление класса 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() // Файла А ???
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2013, 23:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Многофайловые программы (C++):

Многофайловые программы - C++
Подскажите пожалуйста как запускать многофайлове программы. Вот например файл А #include&lt;iostream&gt; using namespace std; int...

Функции и многофайловые программы в Си - C++
Доброе утро, у меня есть задание. - каждая подпрограмма является функционально завершенной и должна вызываться более одного раза с...

Модули. Многофайловые проекты - C++
Определить функцию, возвращающую количество недель с начала года. Выполнить перегрузку функции для следующих типов параметров: ...

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

Классы. Многофайловые проекты. Описать класс с именем STUDENT - C++
Описать класс с именем STUDENT, содержащий поля:  фамилия и инициалы;  номер группы;  успеваемость (массив из пяти элементов). ...

Составить блок схему для программы упорядочивания чисел в массиве(код программы прилагается) - C++
#include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace std; int main() { int N = 0; // N - количество элементов в массиве...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.09.2013, 00:59 #2
Цитата Сообщение от ArkTaS Посмотреть сообщение
Ведь каждый исходный файл может иметь свое определение класса
Он и имеет, одного и того же класса.

Добавлено через 10 минут
В файле А и в файле В, определяется один и тот же класс some. Используется то определение, файл с которым компилятор обрабатывает первым (тут - А).
0
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"
}
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.09.2013, 22:46 #4
Цитата Сообщение от ArkTaS Посмотреть сообщение
Что тут можно подумать, что ему все равно какое теперь определение в файле В.
Именно. Компилятор смотрит на название класса в файле B. У компилятора уже есть определение класса some, сделанное в файле A, поэтому, повторное определение класса some (по сути - повторное объявление), компилятор просто пропускает. Можете написать там что угодно, это ничего не изменит, пока имя класса будет то же. Исключите файл A из проекта, измените его имя на C и снова добавьте в проект. Теперь первым будет обрабатываться файл B, и начнёт действовать определение класса some, сделанное в этом файле.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2013, 22:46
Привет! Вот еще темы с ответами:

Программы из самоучителя C++ для чайников выводит ошибку. Как собрать эти же программы, только без ошибки? - C++
На этом форуме уже есть похожие темы, но корректирование этих программ исключив русские символы не дали существенного результата.

Открытие файла другой программы из программы.Косяк. - C++
Итак, есть в программе такой кусок: system(&quot;E:\\KMPlayer\\KMPlayer.exe E:\\WINDOWS\\New_year.mp3&quot;); Косяк в том, что пока песня не дойдёт...

Подскажите. Не компилирует текст программы, запрашивает в коде мол не достающую скобку. Ниже приведен текст программы. - C++
#include &lt;iostream.h&gt; unsigned int perimetr ( int a,int b); int main() { int a,b; cin &gt;&gt; a; cin &gt;&gt; b; cout &lt;&lt; &quot;perimetr=&quot;...

Не понимаю текста программы. Что будет напечатано в результате программы? И что вообще происходит в программе? - C++
class B { int x; B (int a=0) { x = a; cout « 1; } -B () { cout « 3; } }; class D : B { D (int d ) : B (d) {...


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

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

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