3 / 3 / 3
Регистрация: 05.04.2013
Сообщений: 42
1

Перегрузка оператора "+" с шаблонами

17.06.2013, 17:56. Показов 472. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
нужно написать перегрузку оператора +, который объединяет 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;// ну и вот на сумме падает с ошибкой
хотелось бы понять, что я сделал не так?
Миниатюры
Перегрузка оператора "+" с шаблонами  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.06.2013, 17:56
Ответы с готовыми решениями:

Перегрузка с шаблонами
Приветствую всех! Есть такой код: class pbuffer : public std::vector&lt;char&gt; { private: ...

Перегрузка функции шаблонами и параметрами по умолчанию
Такая проблема, надо написать header файл и к нему исходник, в которых нужно описать 3 функции и...

Перегрузка оператора =
помогите создать перегруженный оператор = в классе Х, который будет копировать содержание строки...

перегрузка оператора +
Не могу понять: в 184 строке отказывается работать. Без нее - все нормально. Скорее всего...

Перегрузка оператора >>
Добрый день. Пытаюсь перегрузить оператор ввода. Выдаёт ошибку:&quot;отсутствует оператор...

8
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
17.06.2013, 17:58 2
Где конструктор копий?
0
3 / 3 / 3
Регистрация: 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];
}
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
17.06.2013, 18:07 4
И деструктор тоже и оператор присваивания. А лучше весь код.
Судя по ошибке где-то с new/delete, наверное, напутали.
0
3 / 3 / 3
Регистрация: 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;
}
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
17.06.2013, 18:40 6
Цитата Сообщение от Croessmah Посмотреть сообщение
А лучше весь код.
Весь код. Который можно скомпилировать и проверить.
0
3 / 3 / 3
Регистрация: 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 байт, 4 просмотров)
Тип файла: txt input2.txt (42 байт, 4 просмотров)
0
3 / 3 / 3
Регистрация: 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,
БИНГО
прошу прощения за не профессионализм, похоже, что не работало из-за отсутствия перегрузки оператора =
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 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;
}
0
17.06.2013, 19:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2013, 19:25
Помогаю со студенческими работами здесь

Перегрузка оператора =
Ещё раз всем привет! Недавно разместила у себя &quot;лайт-вершин&quot; своего вектора - int_array. И все...

Перегрузка оператора []
Что не правильно я перегрузил? #include &lt;iostream&gt; #include &lt;locale.h&gt; using namespace std;...

Перегрузка оператора ==
Я уже встречала подобный вопрос на этом форуме, но у меня всё равно что-то не получается Вот...

Перегрузка оператора *
Операция произведения применяется к объекту квадрат, при этом изменяются координаты центры фигуры....

Перегрузка оператора <<
Доброго времени суток. В общем задача состоит в том, чтобы перегрузить операторы &gt;&gt; и &lt;&lt; для...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru