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

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

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

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

02.12.2012, 20:55. Просмотров 2598. Ответов 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()... ??
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
coloc
погромист
409 / 245 / 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;
}

Поняли?
Olejan_one
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 106
Завершенные тесты: 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;
 
}
coloc
погромист
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
02.12.2012, 21:24     Разделение программы на интерфейс и реализацию #5
Ошибочка, в main тоже нужно написать #include <array.h>. На скорую руку написал, извините.
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(). И так далее.
тип_возвр_знач Название_класса::название_метода (список параметров) {реализация}
MaRKerNSK
24 / 11 / 1
Регистрация: 26.11.2012
Сообщений: 110
Записей в блоге: 2
02.12.2012, 21:26     Разделение программы на интерфейс и реализацию #7
coloc, точнее даже наверно
C++
1
#include "array.h"
Olejan_one
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 106
Завершенные тесты: 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 минут
прошу прощения ошибка на этапе компиляции
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
02.12.2012, 22:29     Разделение программы на интерфейс и реализацию #9
Olejan_one, полный код и копипасту ошибки в студию. А так не понятно.
Olejan_one
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 106
Завершенные тесты: 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 то всё работает идеально.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2012, 22:58     Разделение программы на интерфейс и реализацию
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
02.12.2012, 22:58     Разделение программы на интерфейс и реализацию #11
Нужно добавить
C
1
#include <iostream>
в файле head.h
Yandex
Объявления
02.12.2012, 22:58     Разделение программы на интерфейс и реализацию
Ответ Создать тему
Опции темы

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