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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.60
Olejan_one
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 108
Завершенные тесты: 2
#1

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

02.12.2012, 20:55. Просмотров 2905. Ответов 10
Метки нет (Все метки)

Добрый вечер! Проблема в следующем:
Компилятор visual studio 2010.
есть программа, в которой создан 1 класс (данные о пользователях)
программа работает.
Есть один минус - весь код написан в одном файле *.cpp
Я хочу разделить её на части -
1. в разделе проекта Header Files создать header - файл *.h в котором будут реализованы поля класса и прототипы методов.
2. в разделе проекта Source files создать файл реализации методов *.cpp в котором будут расписаны (реализованы) эти методы.
3. в разделе проекта Source files создать файл main.cpp . В котором будут находиться главная функция main, в ней будет вся реализация программы и вызов вышеуказанных методов.
В коде реализовано примерно так:
Главный файл:
head.h

C++
1
2
3
4
5
6
7
8
9
10
#pragma once
#include "person.cpp"//подключение файла с реализацией методов
 
class person
{
char* name;
char* surname;//свойства класса
void set_person()//метод ввода
и.т.д.
}
второй файл
person.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
//[B]необходимо ли здесь подключать какие либо библиотеки либо может надо подключить head.h?????[/B]
//подчеркивает слово ниже  - head   (Error name followed by '::' must be a class or namespace name)
void head::person()
{
// реализация конструктора по умолчанию
.name=NULL;
surname=NULL;
и.т.д.
.
.
}
Третий файл main.cpp
Здесь вроде как всё нормально, ничего не подчеркивает , связал нормально
C++
1
2
3
4
5
6
7
8
9
10
#"head.h"
# <iostream>
 
using namespace std;
void main ()
{
 
//реализация программы 
 
}
Подскажите что не так с файлом person.cpp??? Как его надо связать и как надо обращаться к методам класса например так - head :: person()... ??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2012, 20:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разделение программы на интерфейс и реализацию (C++):

Разделение класса на интерфейс и реализацию (ошибка __thiscall) - C++
Всем хай! Есть такой наипростейший класс (для примера): #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class...

как лучше всего добавлять предопределенные изменяемые значения char в интерфейс и реализацию класса? - C++
Есть несколько непонятных мне моментов связанных с тем как использовать char в классе. 1. как лучше всего добавлять предопределенные...

как лучше всего добавлять предопределенные изменяемые значения массива char в интерфейс и реализацию класса? - C++
Есть несколько непонятных мне моментов связанных с тем как использовать char в классе. 2. Как сделать тоже самое но с массивом...

Разделение программы - C++
Добрый день! Написал программу. Код получился очень длинный. Как разделить её на части? Например, чтобы какая-нибудь функция была...

Разделение программы на файлы - C++
Всем привет. Изучаю алгоритмы сортировки. Вот что уже написал: //sort.cpp #include &quot;sort.h&quot; template &lt;class T&gt; void...

Разделение интерфейса программы - C++
Добрый день. У меня такая проблема: Мне нужно разделить следующую программу на интерфейсы ( на раздельные файлы): pair.h fraction.h ...

10
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
02.12.2012, 21:09 #2
В head.h объявляешь класс. Никаких #include "person.cpp" не нужно в нем.
В person.cpp реализуешь методы. Инклудишь в него файл head.h.
В main.cpp работаешь с классом. Инклудишь в него head.h
1
coloc
погромист
410 / 246 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
02.12.2012, 21:16 #3
Обьясню на примере класса Array:

Кликните здесь для просмотра всего текста

Array.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef ARRAY_H
#define ARRAY_H
class Array
{
      typedef unsigned int size_t;
      private:
              size_t mySize;
              int* myData;
      public:
             Array (size_t size);
             ~Array ();
             void set (int i, int val);
};
#endif
Array.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <conio.h>
#include "array.h"
 
typedef unsigned int size_t;
 
Array::Array (size_t size)
{
             mySize = size;
             myData = new int [mySize];
}
 
Array::~Array ()
{
              delete[] myData;
}
 
void Array::set (int i, int val)
{
     if ((i < 0) || (i > mySize - 1)) { return; }
     myData [i] = val;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <conio.h>
 
int main()
{
Array a(20);
a.set(5,4);
return 0;
}

Поняли?
0
Olejan_one
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 108
Завершенные тесты: 2
02.12.2012, 21:23  [ТС] #4
Цитата Сообщение от WhiteP Посмотреть сообщение
В head.h объявляешь класс. Никаких #include "person.cpp" не нужно в нем.
В person.cpp реализуешь методы. Инклудишь в него файл head.h.
В main.cpp работаешь с классом. Инклудишь в него head.h
Всё сделал как вы написали, но всё равно выдаёт ту же ошибку что и была(в файле person при обращении к методу
подчеркивает всё что можно)
например:
в файле person я пишу
C++
1
2
3
4
5
6
7
#include "head.h"
head::person() //подчеркивает слово head (Error name followed by '::' must be a class or namespace name)
{
name=NULL;
surname=NULL;
 
}
0
coloc
погромист
410 / 246 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
02.12.2012, 21:24 #5
Ошибочка, в main тоже нужно написать #include <array.h>. На скорую руку написал, извините.
1
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
02.12.2012, 21:26 #6
C++
1
person::person()
должно быть для конструктора.
C++
1
void person::set_person()
для set_person(). И так далее.
тип_возвр_знач Название_класса::название_метода (список параметров) {реализация}
1
MaRKerNSK
24 / 11 / 1
Регистрация: 26.11.2012
Сообщений: 110
Записей в блоге: 2
02.12.2012, 21:26 #7
coloc, точнее даже наверно
C++
1
#include "array.h"
1
Olejan_one
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 108
Завершенные тесты: 2
02.12.2012, 22:26  [ТС] #8
Спасибо всем, почти разобрался, но появилась одна ошибка - на этапе выполнения.
Пишет что функция не берет 1 аргумент.
Если конкретней то:
у меня есть 2 метода :
1-й
запись в бинарный файл
2-й
считывание из бинарного файла
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//в head.h я пишу 
void file_man(FILE* afp);//прототип на метод считывания, в качестве параметра 
                        //который принимает метод - объявлен указатель на файл 'afp'
void read_person(FILE* afp2);//прототип на метод считывания, в качестве параметра который 
                               //принимает метод - объявлен  указатель на файл 'afp2'
 
 
//в файле person.cpp я пишу 
void person::file_man(FILE* afp)
{
...
}
//и 
 
void person::read_person(FILE* afp2)
{
...
}
//в файле main.cpp я создаю динамический массив экземпляров класса 
//и в цикле вызываю по очереди один из методов. 
//вот так:
mas[i]->file_man(fp)//вызов метода записи в файл, передача в функцию 
//указателя на файл 'fp'.
Добавлено через 17 минут
прошу прощения ошибка на этапе компиляции
0
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
02.12.2012, 22:29 #9
Olejan_one, полный код и копипасту ошибки в студию. А так не понятно.
0
Olejan_one
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 108
Завершенные тесты: 2
02.12.2012, 22:38  [ТС] #10
файл head:
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
#pragma once
struct data
{
    int day;
    char* month;
    int year;
};
class person
{
public:
    char* name;
    char* surname;
    char* otchestvo;
    int tell;
    int icq;
    char* mail;
    data date;
 
    person ();
    
    void set_person (char*,char*,char*,char*,int,char*,int,int,int);
    
    void get_person ();
    
    void print_person ();
 
    void file_man(FILE*);
 
    void read_person(FILE*);
    
    ~person ();
    
};
файл person:
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
#include <iostream>
#include <string.h>
#include "head.h"
using namespace std;
person::person ()
    {
        name=NULL;
        surname=NULL;
        otchestvo=NULL;
        date.month=NULL;
        mail=NULL;
        icq=tell=date.day=date.year=0;
 
    }
    void person::set_person (char* aName,char* aSurname,char* aOtchestvo,char* aMail,int aDay,char* aMonth,int aYear,int aTell,int aIcq)
    {
        name=new char [strlen(aName)+1];
        strcpy(name, aName);
        surname=new char [strlen(aSurname)+1];
        strcpy(surname,aSurname);
        otchestvo=new char [strlen(aOtchestvo)+1];
        strcpy(otchestvo,aOtchestvo);
        mail=new char [strlen(aMail)+1];
        strcpy(mail,aMail);
        date.day=aDay;
        date.month=new char [strlen(aMonth)+1];
        strcpy(date.month,aMonth);
        date.year=aYear;
        strcpy(date.month,date.month);
        tell=aTell;
        icq=aIcq;
    }
    void person::get_person ()
    {
        cout<<"vyberite punct=\n1-vyvesti imya studenta\n2-vyvesti datu rogdeniya\n3-vyvesti nomer telefona\n"
            "4-vyvesti mail studenta\n5-vuvesti nomer icq"<<endl;
 
        int a;
        cin>>a;
        switch (a)
        {
        case 1:
            cout<<surname<<"."<<name<<"."<<otchestvo<<endl;
            break;
        case 2:
            cout<<date.day<<"."<<date.month<<"."<<date.year<<endl;
            break;
        case 3:
            cout<<tell;
            break;
        case 4:
 
            cout<<mail;
            break;
        case 5:
            cout<<icq;
            break;
        }
    }
    void person::print_person ()
 
    {
 
        cout<<"name - "<<surname<<"  "<<name<<"  "<<otchestvo<<endl;
        cout<<"date - "<<date.day<<"."<<date.month<<"."<<date.year<<endl;
        cout<<"telephone nomber - "<<tell<<endl;
        cout<<"mail - "<<mail<<endl;
        cout<<"icq nomber - "<<icq<<endl;
    }
    void person::file_man(FILE *afp)
    {
 
        int sz = strlen(name);
        fwrite(&sz,sizeof(sz),1,afp);
        fwrite(name,sz,1,afp);
        int sz1 = strlen(surname);
        fwrite(&sz1,sizeof(sz1),1,afp);
        fwrite(surname,sz1,1,afp);
 
        int sz2 = strlen(otchestvo);
        fwrite(&sz2,sizeof(sz2),1,afp);
        fwrite(otchestvo,sz2,1,afp);
        int sz3 = strlen(mail);
        fwrite(&sz3,sizeof(sz3),1,afp);
        fwrite(mail,sz3,1,afp);
        fwrite(&tell,sizeof (tell),1,afp); 
        fwrite(&icq,sizeof (icq),1,afp);
        fwrite(&date.day,sizeof (date.day),1,afp);
        int sz4 = strlen(date.month);
        fwrite(&sz4,sizeof(sz4),1,afp);
        fwrite(date.month,sz4,1,afp);
        fwrite(&date.year,sizeof (date.year),1,afp);
        
        
 
    }
    void person::read_person(FILE *afp2)
    {
        int sz = 0;
        fread(&sz,sizeof(sz),1,afp2);
        if(name) delete[] name;
        name = new char[sz+1];
        name[sz] = 0;
        fread(name,sz,1,afp2);
        int sz1 = 0;
        fread(&sz1,sizeof(sz1),1,afp2);
        if(surname) delete[] surname;
        surname = new char[sz1+1];
        surname[sz1] = 0;
        fread(surname,sz1,1,afp2);
        int sz2 = 0;
        fread(&sz2,sizeof(sz2),1,afp2);
        if(otchestvo) delete[] otchestvo;
        otchestvo = new char[sz2+1];
        otchestvo[sz2] = 0;
        fread(otchestvo,sz2,1,afp2);
        int sz3 = 0;
        fread(&sz3,sizeof(sz3),1,afp2);
        if(mail) delete[] mail;
        mail = new char[sz3+1];
        mail[sz3] = 0;
        fread(mail,sz3,1,afp2);
        fread(&tell,sizeof (tell),1,afp2); 
        fread(&icq,sizeof (icq),1,afp2);
        fread(&date.day,sizeof (date.day),1,afp2);
        int sz4 = 0;
        fread(&sz4,sizeof(sz4),1,afp2);
        if(date.month) delete[] date.month;
        date.month = new char[sz4+1];
        date.month[sz4] = 0;
        fread(date.month,sz4,1,afp2);
        fread(&date.year,sizeof (date.year),1,afp2);
 
    }
    
 
    person::~person ()
    {
        delete[] name;
        delete[] surname;
        delete[] mail;
        delete[] otchestvo;
    }
файл 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
#include "head.h"
#include <iostream>
#include <conio.h>
 
using namespace std;
 
void main()
{
int size=0;
person** mas=new person *[size];
char name[200];
char surname[200];
char otchestvo[200];
char mail [200];
int tell;
int icq;
int day;
int year;
char month[20];
int menu;
bool i=true;
while (i)
{
    cout<<"\n\n";
    cout<<"***********Please choose a necessary point**************\n";
    cout<<"1-to enter information about an user\n2-search of user and request for concrete information\n"
        "3-conclusion of all information about a concrete user\n4-file wfite\n5-file read\n6-exit\n";
 
    
    cin>>menu;
    
    switch (menu)
    {
    case 1:  //реализация метода ввода необходимо задать количество пользователей, которых буду вводить.
        cout << "___________Please enter the amount of users for the method of input:\n";
        cin>>size;
        
        for (int i=0;i<size;i++){
            cout<<"******person number"<<i+1<<" *****\n";
            mas[i]=new person;
            cout<<"please enter surname=";
            cin>>surname;
            cout<<"please enter name=";
            cin>>name;
            cout<<"please enter patronymic=";
            cin>>otchestvo;
            cout<<"please enter email=";
            cin>>mail;
            cout<<"please enter birsday=";
            cin>>day;
            cout<<"please enter month of birth=";
            cin>>month;
            cout<<"please enter year of birth=";
            cin>>year;
            cout<<"please enter telephone of user number=";
            cin>>tell;
            cout<<"please enter ICQ of user number=";
            cin>>icq;
            mas[i]->set_person (name,surname,otchestvo,mail,day,month,year,tell,icq);
            cout<<"------------------------------------------------------\n";
 
        }
        break;
        //________________________________________________________________________________________________________
    case 2:          //реализация метода поиска пользователя по фамилии
        char fam [20];
        cout<<"vvedite familiy personu=\n";
        cin>>fam;
 
        for(int i=0;i<size;i++)
        {
            
            if (stricmp(fam,mas[i]->surname)==0)
                mas[i]->get_person();
            
        }
        break;
 
    case 3: //реализация вывода всех сведений о пользователе        
        cout<<"vvedite nomer persony dlya vivoda vsex dannux\n";
        int r;
        cin>>r;
        if (*mas[r-1]->name!=NULL)
        {
            mas[r-1]->print_person ();
        }
        break;
 
        cout<<"file manager\n";
    case 4://запись в файл
        {
            FILE *fp=fopen("first.txt","wb");
            if (!fp)
            {
                cout<<"error";
                _getch();   
                return;
            }
            for (int i=0;i<size;i++)
            {
                mas[i]->file_man(fp);  
            }
            
            fclose(fp);
        }
        break;
    case 5://чтение из файла
        {
            
            FILE* fp2=fopen("first.txt","rb");
            if (!fp2)
            {
                cout<<"error";
                _getch();   
                return;
            }
            
            cout<<"Please enter the amount of users which must be counted from a file\n";
            cin>>size;
            for(int i=0;i<size;i++)
            {
                mas[i]=new person;
                mas[i]->read_person(fp2);
 
            }
            for(int i=0;i<size;i++)
            {
 
 
                cout<<"person "<<i+1<<":\n"<<"name:"<<mas[i]->name<<
                    " "<<mas[i]->surname<<" "<<mas[i]->otchestvo<<"\n"<<
                    "e-mail:"<<mas[i]->mail<<endl;
                cout<<"birsday:"<<mas[i]->date.day<<"."<<mas[i]->date.month<<"."<<mas[i]->date.year<<"\n";
                cout<<"nomber telephone:"<<mas[i]->tell<<"\n";
                cout<<"nomber ICQ:"<<mas[i]->icq<<"\n";
            }
            fclose(fp2);
        }   
        break;
 
        case 6:
    
    exit(0);
    
    
}
    }
    
delete[] mas;
 
}
Добавлено через 1 минуту
Если в одном файле *.cpp то всё работает идеально.
0
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
02.12.2012, 22:58 #11
Нужно добавить
C
1
#include <iostream>
в файле head.h
0
02.12.2012, 22:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2012, 22:58
Привет! Вот еще темы с ответами:

Разделение программы на несколько файлов - C++
Всем доброго времени суток! Возникла проблема - я написал небольшую програмку в main. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt;...

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

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

Интерфейс программы - C++
можно ли написать код чтобы у программы написанной наС++ не было интерфейса?


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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