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

Разделить программу на файлы - C++

Восстановить пароль Регистрация
 
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
10.01.2013, 22:07     Разделить программу на файлы #1
Помогите мне разделить программу на три файла: сам класс, функции к нему, и функция main.
Сам класс
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
29
30
31
#ifndef ARRAY1_H
#define ARRAY1_H
 
#include <iostream.h>
 
class Array{
      
      friend ostream &operator<<(ostream &, Array &);
      friend istream &operator>>(istream &, Array &);
public:
       Array(int =10);
       Array(const Array &);
       ~Array();
       int getSize() const;
       const Array &operator=(const Array &);
       
       int operator==(const Array &) const;
       int operator!=(const Array &) const;
       
       int &operator[](int);
       static int getArrayCount();
       
private:
        int *ptr;
        
        int size;
        static int arrayCount;
        
};
 
#endif
Вот эту программу нужно разделить на два файла: функции и главная функция main
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <iostream.h>
#include <stdlib.h>
#include <assert.h>
#include "array1.h"
 
int Array::arrayCount=0;
 
Array::Array(int arraySize)
{
                 ++arrayCount;
                 size=arraySize;
                 ptr=new int [size];
                 assert(ptr!=0);
                 
                 for(int i=0;i<size;++i)
                   ptr[i]=0;
                 }
Array::Array(const Array &init)
{
                   ++arrayCount;
                   size=init.size;
                   ptr=new int [size];
                   assert(ptr!=0);
                   
                   for(int i=0;i<size;i++)
                     ptr[i]=init.ptr[i];
                   }
Array::~Array()
{
         --arrayCount;
         delete [] ptr;
  }
  
int Array::getSize() const {return size;}
 
const Array &Array::operator=(const Array &right)
{
      if(&right != this){
                delete [] ptr;
                size = right.size;
                ptr = new int [size];
                assert(ptr!=0);
                
                for(int i=0;i<size;i++)
                   ptr[i]=right.ptr[i];
                   }
                   return *this;
}
 
int Array::operator==(const Array &right) const
{
    if(size!=right.size)
      return 0;
    for(int i=0;i<size;i++)
      if(ptr[i]!=right.ptr[i])
        return 0;
      
      return 1;
}
 
int Array::operator!=(const Array &right) const
{
    if(size!=right.size)
      return 1;
    for(int i=0;i<size;i++)
      if(ptr[i]!=right.ptr[i])
        return 1;
      
      return 0;
}
 
int &Array::operator[](int subscript)
{
    assert(0<=subscript && subscript < size);
    
    return ptr[subscript];
}
 
int Array::getArrayCount(){return arrayCount;}
 
istream &operator>>(istream &input, Array &a)
{
        for(int i=0;i<a.size;i++)
          input>>a.ptr[i];
          
        return input;
        }
ostream &operator<<(ostream &output, Array &a)
{
        for(int i=0;i<a.size;i++){
           output<<a.ptr[i]<<" ";
           
           if((i+1)%10==0)
             output<<endl;
             }
        
        return output;
}
 
 
 
 
        int main()
{
    cout<<"Number created array = "<<Array::getArrayCount()<<endl;
    
    Array integers1(7),integers2;
    
    cout<<"Number created array = "<<Array::getArrayCount()<<endl<<endl;
    
    cout<<"Size array integers1 = "<<integers1.getSize()<<endl<<"Array after set value:"<<endl<<integers1<<endl;
    
    cout<<"Size array integers2 = "<<integers2.getSize()<<endl<<"Array after set value:"<<endl<<integers2<<endl;
    
    cout<<"Enter 17 int namber:"<<endl;
    
    cin>>integers1>>integers2;
    
    cout<<"After enter array contains:"<<endl<<"integers1: "<<integers1<<"integers2: "<<integers2<<endl;
    
    cout<<"Rating: integers1 != integers2"<<endl;
    
    if(integers1 != integers2)
      cout<<"They are not equal"<<endl;
    
    Array integers3(integers1);
    
    cout<<endl<<"Size array integers3 = "<<integers3.getSize()<<endl<<"Array after set value:"<<endl<<integers3<<endl;
    
    cout<<"integers1 = integers2"<<endl;
    
    cout<<"integers1:"<<integers1<<endl<<"integers2:"<<integers2<<endl;
    
    cout<<"Rating: integers1 == integers2"<<endl;
    
    if(integers1==integers2) 
      cout<<"They are equal"<<endl<<endl;
    
    cout<<"Integers1[5] == "<<integers1[5]<<endl;
    
    cout<<"integers1[5]=1000"<<endl;
    integers1[5]=1000;
    
    cout<<"integers1: "<<integers1<<endl;
    
    cout<<"integers1[15] = 1000, error, maxlength"<<endl;
    
    //integers1[15]=1000;
    
    system("pause>0");
    
    return 0;
    
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
10.01.2013, 23:04
  #2

Не по теме:

Операция копипаста? Или что Вы не можете сделать?

tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
10.01.2013, 23:10  [ТС]     Разделить программу на файлы #3
Когда я функции оформляю в отдельный .cpp файл, то эти функции не видит функция main. Как меня сделать так, чтобы функция main видела эти функции но они находились в в разных файлах?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
10.01.2013, 23:13     Разделить программу на файлы #4
в array1.cpp и main.cpp
C++
1
#include "array1.h"
Дальше смотрите по ошибкам компилятора. Мало ли что за ошибки он нашел.
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
10.01.2013, 23:13  [ТС]     Разделить программу на файлы #5
Я понял! Просто нужно было написать вот так
C++
1
#include "array1.cpp"
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
10.01.2013, 23:14     Разделить программу на файлы #6
объявить эти функции в мейне или его заголовке, а реализовать в отдельном срр файле.
Среда разработки сама всё соберёт

Добавлено через 19 секунд
Цитата Сообщение от tokar2 Посмотреть сообщение
#include "array1.cpp"
НЕТ! тебе написали не так. Самое частое заблуждение начинающих - они думают, что при раздельной компиляции cpp файлы должны всё друг о друге знать и включаться друг в друга.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
10.01.2013, 23:14     Разделить программу на файлы #7
Цитата Сообщение от tokar2 Посмотреть сообщение
C++
1
#include "array1.cpp"
Не подключайте .cpp файлы таким образом
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
10.01.2013, 23:15  [ТС]     Разделить программу на файлы #8
Я просто не знал как подключить .cpp файл в программу, думал что он сам подключится)

Добавлено через 34 секунды
А каким тогда образом?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
10.01.2013, 23:17     Разделить программу на файлы #9
никаким, я же сказал: никаких инклудов. Включай его в проект - IDE сама разберётся
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
10.01.2013, 23:19  [ТС]     Разделить программу на файлы #10
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
НЕТ! тебе написали не так. Самое частое заблуждение начинающих - они думают, что при раздельной компиляции cpp файлы должны всё друг о друге знать и включаться друг в друга.
Можете это как-то аргументировать? Так как я начинающий мне интересно, почему?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
10.01.2013, 23:23     Разделить программу на файлы #11
Цитата Сообщение от tokar2 Посмотреть сообщение
А каким тогда образом?
Какая у Вас IDE и компилятор?
На студии при небольшой модернизации все компилируется без проблем

Добавлено через 2 минуты
Цитата Сообщение от tokar2 Посмотреть сообщение
Можете это как-то аргументировать? Так как я начинающий мне интересно, почему?
Соседняя тема: Вызов функции из другого файла
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
10.01.2013, 23:26  [ТС]     Разделить программу на файлы #12
Компилятор Dev C++. И теперь тупой вопрос, что такое IDE?)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
10.01.2013, 23:29     Разделить программу на файлы #13
Цитата Сообщение от tokar2 Посмотреть сообщение
И теперь тупой вопрос, что такое IDE?
Как раз Dev C++ - это не компилятор, а IDE
Интегрированная среда разработки

А компилятор там, наверное, MinGW(GCC)
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
10.01.2013, 23:47     Разделить программу на файлы #14
Цитата Сообщение от tokar2 Посмотреть сообщение
Можете это как-то аргументировать? Так как я начинающий мне интересно, почему?
Потому что существует такое понятие "раздельная компиляция". Компилятор может генерировать из СРР файла промежуточный код, совершенно не волнуясь, что в коде недостаточно некоторых переменных и функций.

Непосредственным выполнением директивы #include (грубо говоря копипастингом одного файла в другой) занимается не компилятор, а препроцессор, да. Но если попытаться использовать эту директиву, окажется, что в проекте продублированы некоторые функции.

После работы препроцессора компилятор должен скомпилировать каждый срр файл по отдельности. При этом, в срр файле могут использоваться внешние переменные и функции из других файлов. Компилятору их нужно только их declaration, т.е объявление без тела, чтобы просто сгенерировать вызов с аргументами в правильном порядке или выдать ошибку о синтаксически неправильном вызове функции.

Таким образом, компилятор генерирует промежуточный файл, в котором все функции грамотно вызываются по своему адресу, а вот по какому именно адресу позже разберётся не компилятор, а линкер. При этом одно из достоинств раздельной компиляции то, что при добавлении в проект нового кода(или изменении какого-то срр-файла) остальные файлы не требуется перекомпилировать. К тому же, в программу помимо скомпилированных cpp файлов могут быть включены сторонние библиотеки функций. (файлы с расширением .lib) Все эти куски кода собираются линкером в один exe файл. Он и разбирает, куда ведёт вызов какой функции, и если ты неправильно их объявил или забыл объявить, то выдаёт "Linker error". При этом синтаксис программы был абсолютно грамотный, поэтому компилятор их спокойно прожевал и отдал линкеру.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2013, 23:56     Разделить программу на файлы
Еще ссылки по теме:

Как разделить программу на функции C++
C++ Как разделить программу на функции
Как разделить программу на две части? C++

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

Или воспользуйтесь поиском по форуму:
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
10.01.2013, 23:56  [ТС]     Разделить программу на файлы #15
А можно сделать два заголовочних файлы, это будет лучше чем подключать .cpp?
C++
1
2
#include "array1.h"
#include "array2.h"
Yandex
Объявления
10.01.2013, 23:56     Разделить программу на файлы
Ответ Создать тему
Опции темы

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