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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
#1

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

29.01.2013, 16:00. Просмотров 1962. Ответов 21
Метки нет (Все метки)

Всем привет. Изучаю алгоритмы сортировки. Вот что уже написал:

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
//sort.cpp
 
#include "sort.h"
 
template <class T>
void SelectSort(T list[], int size)
{
    int minPtr;
 
    for(int i = 0; i < size - 1; i++)
    {
        //ищем минимимальный элемент в списке list[i + 1, ... , size - 1]
        minPtr = i + 1;
        for(int j = minPtr + 1; j < size; j++)
            if(list[j] < list[minPtr])
                minPtr = j;
 
        //меняем местами найденный элемент и list[i] (если требуется)
        if(list[minPtr] < list[i])
            swap(list[minPtr], list[i]);
    }
}
 
template <class T>
void InsertSort(T list[], int size)
{
    int location;
    T newElement;
 
    for(int i = 1; i < size; i++){
        newElement = list[i];
        location = i - 1;
 
        //поиск места для вставки нового элемента
        while((location >= 0) && (list[location] > newElement)){
            list[location + 1] = list[location];
            location--;
        }
 
        //место найдено, вставляем новый элемент
        list[location + 1] = newElement;
    }
}
 
template <class T>
void BubbleSort(T list[], int size)
{
    for(int pass = 1; pass <= size - 1; pass++)
        for(int elem = 0; elem < size - pass ; elem++)
            if(list[elem] > list[elem + 1])
                swap(list[elem], list[elem + 1]);
}
 
template <class T>
void BubbleSortFast(T list[], int size)
{
    bool swapped = true;
 
    for(int i = 1; swapped && (i <= size-1); i++){
        swapped = false;
 
        for(int j = 0; j < size - i; j++)
            if(list[j] > list[j + 1]){
                swap(list[j], list[j + 1]);
                swapped = true;
            }
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   //sort.h
#include <iostream>
using namespace std;
 
//сортировка выбором
template <class T>
void SelectSort(T list[], int size);
 
//сортировка вставками
template <class T>
void InsertSort(T list[], int size);
 
//сортировка пузырьком
template <class T>
void BubbleSort(T list[], int size);
 
//модифицированная сортировка пузырьком
template <class T>
void BubbleSortFast(T list[], int size);

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  //main.cpp
#include "sort.h"
 
int main(void){
    const int SIZE = 11;
    int list[SIZE] = {1,45,123,5,2,034,6,23,4,56,2};
 
    ::BubbleSortFast(list, SIZE);
    for(int i = 0; i < SIZE; i++)
        cout << list[i] << ' ';
    cout << endl;
 
    return 0;
}
Выскакивает ошибка, которая на фото. Если весь код засовываю в один файл main.cpp, тогда всё работает. Как вы считаете в чём может быть дело???
Миниатюры
Разделение программы на файлы  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
29.01.2013, 16:13  [ТС]     Разделение программы на файлы #2
Кажется я обнаружил, как ошибку исправить. Я попробовал переписать весь код убрав шаблоны и используя вместо класса T везде тип int. Программа заработала. Но в чём тогда ошибка? И как использовать шаблоны при разделение программа на файлы?

Добавлено через 39 секунд
Чего я незнаю?
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
29.01.2013, 16:15     Разделение программы на файлы #3
В чем причина не знаю, но скорее всего связано с тем щи вы используемой шаблоны. Там есть свои причуды связанные с файлами. Но если в main включить sort.cpp то все работает.

Вот так работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//sort.h
#include <iostream>
using namespace std;
 
//сортировка выбором
template <class T>
void SelectSort(T list[], int size);
 
//сортировка вставками
template <class T>
void InsertSort(T list[], int size);
 
//сортировка пузырьком
template <class T>
void BubbleSort(T list[], int size);
 
//модифицированная сортировка пузырьком
template <class T>
void BubbleSortFast(T list[], int size);
 
#include "sort.cpp"
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
//sort.cpp
 
template <class T>
void SelectSort(T list[], int size)
{
    int minPtr;
 
    for(int i = 0; i < size - 1; i++)
    {
        //ищем минимимальный элемент в списке list[i + 1, ... , size - 1]
        minPtr = i + 1;
        for(int j = minPtr + 1; j < size; j++)
            if(list[j] < list[minPtr])
                minPtr = j;
 
        //меняем местами найденный элемент и list[i] (если требуется)
        if(list[minPtr] < list[i])
            swap(list[minPtr], list[i]);
    }
}
 
template <class T>
void InsertSort(T list[], int size)
{
    int location;
    T newElement;
 
    for(int i = 1; i < size; i++){
        newElement = list[i];
        location = i - 1;
 
        //поиск места для вставки нового элемента
        while((location >= 0) && (list[location] > newElement)){
            list[location + 1] = list[location];
            location--;
        }
 
        //место найдено, вставляем новый элемент
        list[location + 1] = newElement;
    }
}
 
template <class T>
void BubbleSort(T list[], int size)
{
    for(int pass = 1; pass <= size - 1; pass++)
        for(int elem = 0; elem < size - pass ; elem++)
            if(list[elem] > list[elem + 1])
                swap(list[elem], list[elem + 1]);
}
 
template <class T>
void BubbleSortFast(T list[], int size)
{
    bool swapped = true;
 
    for(int i = 1; swapped && (i <= size-1); i++){
        swapped = false;
 
        for(int j = 0; j < size - i; j++)
            if(list[j] > list[j + 1]){
                swap(list[j], list[j + 1]);
                swapped = true;
            }
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "sort.h"
 
 
int main(){
    const int SIZE = 11;
    int list[SIZE] = {1,45,123,5,2,034,6,23,4,56,2};
 
    ::BubbleSortFast(list, SIZE);
    for(int i = 0; i < SIZE; i++)
        cout << list[i] << ' ';
    cout << endl;
    system("pause>0");
    return 0;
}
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
29.01.2013, 16:20  [ТС]     Разделение программы на файлы #4
Цитата Сообщение от The_bolT Посмотреть сообщение
Но если в main включить sort.cpp то все работает
Что вы имеет ввиду?

Добавлено через 43 секунды
Как же тогда использовать шаблоны при раздельной компиляции?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
29.01.2013, 16:21     Разделение программы на файлы #5
И объявления и реализация шаблонов должны быть в одном .h файле, только если это не специализация.

Цитата Сообщение от bgm123 Посмотреть сообщение
Как же тогда использовать шаблоны при раздельной компиляции?
Никак. Все в один .h файл.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 16:21     Разделение программы на файлы #6
Шаблоны нельзя использовать при раздельной компиляции, потому что значения в шаблоны подставляются на момент компиляции основной программы
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
29.01.2013, 16:27  [ТС]     Разделение программы на файлы #7
Цитата Сообщение от Toshkarik Посмотреть сообщение
И объявления и реализация шаблонов должны быть в одном .h файле, только если это не специализация
Это какая-то недоработка разработчиков? Или так и должно быть?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
29.01.2013, 16:29     Разделение программы на файлы #8
bgm123, это специфика механизма работы шаблонов.
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
31.01.2013, 18:08     Разделение программы на файлы #9
Цитата Сообщение от Toshkarik Посмотреть сообщение
Никак. Все в один .h файл.
а как же стр.327 "С++ для професионалов" А.Скотлер, Скотт Дж.Клепер?
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
31.01.2013, 18:11     Разделение программы на файлы #10
Alexxx7, К шаблонам данное не относится. Даже boost, использует включение .ipp файлов довольно нечасто.
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
31.01.2013, 18:24     Разделение программы на файлы #11
ForEveR, Тогда подскажите у меня частный случай и так лучше впреть не делать?
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "arry.h"
#include "arry.cpp"
void main(){
    arry<int> first;
    first.pushEnd(10);
    first.pushEnd(1);
    first.pushEnd(2);
    first.pushEnd(3);
    first.pushEnd(34);
    first.pushEnd(56);
    first.pushEnd(1);
    first.show();
}
arry.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
#include<iostream>
 
using namespace std;
template <class T>
class arry
{
    T *ptr;
    size_t size;
    bool chekSize( size_t size);
    
public:
    arry();
    arry(size_t size);
    void pushEnd( int volue);
    void EraseEnd( size_t size);
    void show(void);
    ~arry(void);
};
arry.cpp реализация методов класса
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
#include "arry.h"
template <class T>
arry<T>::arry(){
    ptr = NULL;
    size = 0;
}
template <class T>
arry<T>::arry(size_t size){
    ptr = new T[size] = {0};
    this->size = size;
}
template <class T>
bool arry<T>::chekSize( size_t size){
    this->size < size? return false: return true;
}
template <class T>
void arry<T>::pushEnd( int volue){
    if(ptr == NULL){
        ptr = new T;
        *ptr = volue;
    }
    else{
        T *temp = new T[size+1];
        for(int i = 0; i<size; i++)
            temp[i] = ptr[i];
        temp[size] = volue;
        delete []ptr;
        ptr = temp;
    }
    size++;
}
template <class T>
void arry<T>:: EraseEnd( size_t size){
}
template <class T>
void arry<T>::show(void){
    cout<<"Show:\n";
    for(int i = 0; i<size; i++)
            cout<<ptr[i]<<" ";
    cout<<endl;
}
template <class T>
arry<T>::~arry(void){
    delete []ptr;
}
0x10
2455 / 1627 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
31.01.2013, 18:33     Разделение программы на файлы #12
Alexxx7, неудобно в клиентском коде подключать два файла, относящиеся по факту к одной сущности. Если так тянет разделить код по файлам, то в конце заголовочного файла можете подключить файл с реализацией.
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
31.01.2013, 18:41     Разделение программы на файлы #13
0x10, Да но тогда его нужно делать тоже .h, я подставлял с разширением .cpp выдаёт ошибку что функции уже объявлены. О ещё вариант, можно подключить в клиентский код super.h а в него включить
#include "arry.h"
#include "arry.cpp"
тоже работает, как говорится и "рыбку съесть - и бутылку сдать".
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
31.01.2013, 18:48     Разделение программы на файлы #14
Alexxx7, нельзя делать вот так:

Цитата Сообщение от Alexxx7 Посмотреть сообщение
#include "arry.cpp"
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
31.01.2013, 18:52     Разделение программы на файлы #15
Можно просто подключить в конец объявления класса, и не нужно будет это делать
Цитата Сообщение от Toshkarik Посмотреть сообщение
Alexxx7, нельзя делать вот так:
Сообщение от Alexxx7
#include "arry.cpp"
И все счастливы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
#include<iostream>
 
using namespace std;
template <class T>
class arry
{
    T *ptr;
    size_t size;
    bool chekSize( size_t size);
    
public:
    arry();
    arry(size_t size);
    void pushEnd( int volue);
    void EraseEnd( size_t size);
    void show(void);
    ~arry(void);
};
#include "arry.cpp"
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
31.01.2013, 18:52     Разделение программы на файлы #16
Toshkarik, если нельзя, значит не будем, только почему в книге пишут что можно, или это просто выворот такой, который в последствии может стать минингитом?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
31.01.2013, 18:54     Разделение программы на файлы #17
The_bolT, так тоже нельзя делать.

Добавлено через 48 секунд
Alexxx7, где это пишут?
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
31.01.2013, 18:54     Разделение программы на файлы #18
стр.327 "С++ для професионалов" А.Скотлер, Скотт Дж.Клепер?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
31.01.2013, 19:28     Разделение программы на файлы #19
Alexxx7, я эту книгу не читал. Но думаю авторы имели ввиду, что можно так инклудить хоть .txt файл, главное чтоб он не являлся отдельной единицей трансляции, содержащей определение нешаблонных функций/классов. Все дело в удобстве.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2013, 19:33     Разделение программы на файлы
Еще ссылки по теме:

"Разделение" процессов при работе программы C++
C++ Разделение программы на два файла
C++ Поясните ошибку (разделение класса на файлы)
Разделение кода на cpp и h файлы C++
Разделение программы на .h .cpp .cpp C++

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

Или воспользуйтесь поиском по форуму:
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
31.01.2013, 19:33     Разделение программы на файлы #20
Toshkarik, Значит можно?
Yandex
Объявления
31.01.2013, 19:33     Разделение программы на файлы
Ответ Создать тему
Опции темы

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