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

перегрузка + с шаблонами - C++

Восстановить пароль Регистрация
 
hrustash
3 / 3 / 1
Регистрация: 05.04.2013
Сообщений: 42
17.06.2013, 17:56     перегрузка + с шаблонами #1
нужно написать перегрузку оператора +, который объединяет 2 массива структур в один.
допустим, есть вот такая вот структура
C++
1
2
3
4
5
6
7
8
9
struct Stud1
{
    char name [50];
    char addr [50];
    double price;
    friend istream& operator >> (istream&, Stud1&);
    friend ostream& operator << (ostream&, Stud1&);
    bool operator == (Stud1&);
};
и класс-шаблон, для этого класса и нужна перегрузка +
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
template <class T>
class STUD
{
    int count;
    T *M;
public:
    STUD();
    STUD(int);
    STUD(const STUD&);
    ~STUD();
    void memory();
    void ReadData(istream&);
    void WriteData(ostream&);
    int GetCount();
    T& operator [] (int index);
    STUD<T> operator + (const STUD<T>&s)
        {
            STUD<T> A(count+s.count);
            int i;
            for (i = 0; i < count; i++)
                A.M[i]=M[i];
            for (int j = 0; j < s.count; i++, j++)
                A.M[i]=s.M[j];
            A.count=count+s.count;
            return A;
        }
};
и вот параметрический конструктор, который используется в реализации перегрузки
C++
1
2
3
4
5
6
template <class T>
STUD<T>::STUD(int a)
{
    M = new T [a];
    count = a;
}
реализацию остальных функций, думаю, нет смысла кидать. но если надо - скину.
в мэйне создаю 3 объекта класса STUD с типом массива Struct1
C++
1
2
3
4
STUD<Stud1> A, A1, res;
A.ReadData(in1); //информацию, допустим, читаю из одного и того же файла. чтение работает нормально
A1.ReadData(in1);
res=A+A1;// ну и вот на сумме падает с ошибкой
хотелось бы понять, что я сделал не так?
Миниатюры
перегрузка + с шаблонами  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2013, 17:56     перегрузка + с шаблонами
Посмотрите здесь:

Обращение с шаблонами классов. C++
C++ Работа с шаблонами
Возникла трудность с шаблонами C++
Реализация стека с шаблонами C++
C++ Задача с шаблонами функций
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
17.06.2013, 17:58     перегрузка + с шаблонами #2
Где конструктор копий?
hrustash
3 / 3 / 1
Регистрация: 05.04.2013
Сообщений: 42
17.06.2013, 18:01  [ТС]     перегрузка + с шаблонами #3
Croessmah,
вот

C
1
2
3
4
5
6
7
STUD<T>::STUD(const STUD<T>&s)
{
    count=s.count;
    M=new T[count];
    for (int i = 0; i < count; i++)
        M[i]=s.M[i];
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
17.06.2013, 18:07     перегрузка + с шаблонами #4
И деструктор тоже и оператор присваивания. А лучше весь код.
Судя по ошибке где-то с new/delete, наверное, напутали.
hrustash
3 / 3 / 1
Регистрация: 05.04.2013
Сообщений: 42
17.06.2013, 18:08  [ТС]     перегрузка + с шаблонами #5
Croessmah,
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
#include "structures.h"
template <class T>
class STUD
{
    int count;
    T *M;
public:
    STUD();
    STUD(int);
    STUD(const STUD&);
    ~STUD();
    void memory();
    void ReadData(istream&);
    void WriteData(ostream&);
    int GetCount();
    T& operator [] (int index);
    /*STUD<T> operator + (const STUD<T>&s)
        {
            STUD<T> A(count+s.count);
            int i;
            for (i = 0; i < count; i++)
                A.M[i]=M[i];
            for (int j = 0; j < s.count; i++, j++)
                A.M[i]=s.M[j];
            A.count=count+s.count;
            return A;
        }*/ 
    STUD<T>& operator = (const STUD<T>&);
};
template <class T>
STUD<T>::STUD()
{
    M = new T [1];
    count=1;
}
template <class T>
STUD<T>::STUD(int a)
{
    M = new T [a];
    count = a;
}
template <class T>
STUD<T>::STUD(const STUD<T>&s)
{
    count=s.count;
    M=new T[count];
    for (int i = 0; i < count; i++)
        M[i]=s.M[i];
}
 
 
template <class T>
STUD<T>::~STUD()
{
    delete [] M;
}
 
template <class T>
void STUD<T>::memory()
{
    T *M1=new T [count+1];
    for (int i = 0; i < count; i++)
        M1[i]=M[i];
    delete [] M;
    M=M1;
    count++;
}
template <class T>
void STUD<T>::ReadData(istream& in)
{
    int i=0;
    while (in>>M[i])
    {
        if(in.eof()) break;
        ++i;
        if(i==count)
            memory();
    }
}
template <class T>
void STUD<T>::WriteData(ostream& out)
{
    for (int i = 0; i < count; i++)
        out<<M[i];
}
template <class T>
int STUD<T>::GetCount()
{
    return count;
}
template <class T>
T& STUD<T>::operator[] (int index)
{
    return M[index];
}
template <class T>
STUD<T>& STUD<T>::operator=(const STUD<T>& s)
{
    delete [] M;
    count=s.count;
    M = new T [count];
    for (int i = 0; i < count; i++)
        M[i]=s.M[i];
    return *this;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
17.06.2013, 18:40     перегрузка + с шаблонами #6
Цитата Сообщение от Croessmah Посмотреть сообщение
А лучше весь код.
Весь код. Который можно скомпилировать и проверить.
hrustash
3 / 3 / 1
Регистрация: 05.04.2013
Сообщений: 42
17.06.2013, 19:03  [ТС]     перегрузка + с шаблонами #7
Croessmah,
структуры:
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
#pragma once
#include <fstream>
#include <iostream>
using namespace std;
struct Stud1
{
    char name [50];
    char addr [50];
    double price;
    friend istream& operator >> (istream&, Stud1&);
    friend ostream& operator << (ostream&, Stud1&);
    bool operator == (Stud1&);
};
 
struct Stud2
{
    char name [50];
    friend istream& operator >> (istream&, Stud2&);
    friend ostream& operator << (ostream&, Stud2&);
    bool operator == (Stud2&);
};
 
struct Stud3
{
    char name [50];
    char addr [50];
    char ContrDate [50];
    double price;
};
main:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "Classes.h"
void main()
{
    STUD<Stud1> A, A1, res;
    STUD<Stud2> B;
    STUD<Stud3> C;
    ifstream in1("input1.txt");
    ifstream in2("input2.txt");
    A.ReadData(in1);
    A.WriteData(cout);
    B.ReadData(in2);
    cout<<endl<<endl;
    B.WriteData(cout);
    A1=A;
    //res=A+A1;
    cout<<endl;
    A1.WriteData(cout);
    A1.sort();
    cout<<endl;
    A1.WriteData(cout);
}
и ниже два инпута
Вложения
Тип файла: txt input1.txt (188 байт, 2 просмотров)
Тип файла: txt input2.txt (42 байт, 2 просмотров)
hrustash
3 / 3 / 1
Регистрация: 05.04.2013
Сообщений: 42
17.06.2013, 19:21  [ТС]     перегрузка + с шаблонами #8
Croessmah,
забыл еще .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
#include "structures.h"
 
istream& operator >> (istream& in, Stud1& s)
{
    char temp[10];
    in.getline(s.name, 50);
    in.getline(s.addr, 50);
    in.getline(temp, 30);
    s.price=atoi(temp);
    return in;
}
ostream& operator << (ostream& out, Stud1& s)
{
    out<<s.name<<"  "<<s.addr<<"  "<<s.price<<endl;;
    return out;
}
 
istream& operator >> (istream& in, Stud2& s)
{
    in.getline(s.name, 50);
    return in;
}
 
ostream& operator << (ostream& out, Stud2& s)
{
    out<<s.name<<endl;
    return out;
}
 
bool Stud1::operator == (Stud1& a)
{
    if(strcmp(this->name, a.name)==0) return true;
    else return false;
}
 
bool Stud2::operator == (Stud2& a)
{
    if(strcmp(this->name, a.name)==0) return true;
    else return false;
}
Добавлено через 2 минуты
Croessmah,
БИНГО
прошу прощения за не профессионализм, похоже, что не работало из-за отсутствия перегрузки оператора =
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2013, 19:25     перегрузка + с шаблонами
Еще ссылки по теме:

C++ Задача с шаблонами и наследованием
C++ Как работать с шаблонами
C++ Работа с шаблонами С++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
17.06.2013, 19:25     перегрузка + с шаблонами #9
Цитата Сообщение от hrustash Посмотреть сообщение
прошу прощения за не профессионализм, похоже, что не работало из-за отсутствия перегрузки оператора =
Ага, потому как с таким текстом работает нормально:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
istream& operator >> (istream& lhs, Stud1& rhs){
    lhs.getline(rhs.name,50);
    lhs.getline(rhs.addr,50);
    lhs>>rhs.price;
    lhs.get();
    return lhs;
}
 
ostream& operator << (ostream& lhs, Stud1& rhs){
    lhs<<rhs.name<<std::endl;
    lhs<<rhs.addr<<std::endl;
    lhs<<rhs.price<<std::endl;
    return lhs;
}
Yandex
Объявления
17.06.2013, 19:25     перегрузка + с шаблонами
Ответ Создать тему
Опции темы

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