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

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

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

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

29.01.2013, 16:00. Просмотров 2043. Ответов 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, тогда всё работает. Как вы считаете в чём может быть дело???
Миниатюры
Разделение программы на файлы  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2013, 16:00     Разделение программы на файлы
Посмотрите здесь:

Разделение на файлы - C++
Может кто-то объяснить как разделять код на файлы? (я так понял нужно создать заглавный файл ****.h , создать файл с таким же именем с...

Разделение на файлы - C++
Здравствуйте, друзья! не подскажите почему у меня ругается, когда прогу делю на файлы. Вот куски: main.cpp /* * File: main.cpp...

Разделение кода на cpp и h файлы - C++
Добрый день. Расскажите, пожалуйста, как разделить код на два файла cpp и файл h. #include &lt;iostream&gt; #include &lt;conio.h&gt; using...

Разделение чередующихся строчек в разные файлы - C++
Условие: Файл с исходными данными содержит 2 стихотворения разных авторов (строки чередуются). Составить программу, которая запишет...

Поясните ошибку (разделение класса на файлы) - C++
выношу реализацию в отдельный файл, но как только пытаюсь создать в функции объект класса, получаю ошибку: fatal error LNK1120: 1...

Вложенный шаблонный класс(разделение на файлы) - C++
Есть шаблонный класс для примера A&lt;T&gt; , в него вложен класс B&lt;T&gt; template&lt;class T&gt; class A { public: template&lt;class T&gt; ...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
1140 / 857 / 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
1140 / 857 / 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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
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
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
31.01.2013, 18:48     Разделение программы на файлы #14
Alexxx7, нельзя делать вот так:

Цитата Сообщение от Alexxx7 Посмотреть сообщение
#include "arry.cpp"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2013, 18:52     Разделение программы на файлы
Еще ссылки по теме:

Разделение проекта на файлы .cpp где полностью описывается один класс - C++
Всем привет! Бьюсь над задачей: есть несколько классов, куча объявленных констант через #define и отдельные функции. Захотел все это...

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

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

Разделение программы на интерфейс и реализацию - C++
Добрый вечер! Проблема в следующем: Компилятор visual studio 2010. есть программа, в которой создан 1 класс (данные о пользователях) ...

"Разделение" процессов при работе программы - C++
Всем добрый вечер.Есть некая программа,которая обрабатывает файлы excel.Запускаешь - начинается обработка указанного файла.Если открыть...


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

Или воспользуйтесь поиском по форуму:
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"
Yandex
Объявления
31.01.2013, 18:52     Разделение программы на файлы
Ответ Создать тему
Опции темы

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