Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
hrustash
3 / 3 / 1
Регистрация: 05.04.2013
Сообщений: 42
#1

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

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

нужно написать перегрузку оператора +, который объединяет 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
Миниатюры
Перегрузка оператора "+" с шаблонами  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2013, 17:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора "+" с шаблонами (C++):

Перегрузка оператора "++" и "--" в чем может быть причина нарушение прав доступа? - C++
Вот такой вот код #include &lt;iostream&gt; class d { private: int size ; char *n; public: d()

Перегрузка оператора "++" и "--" , компилирует, но при запуске программы - ошибка - C++
#include &lt;iostream&gt; #include&lt;ctime&gt; #include&lt;stdio.h&gt; #include&lt;locale.h&gt; #include &lt;windows.h&gt; #include &lt;conio.h&gt; ...

Класс "Матрица". Перегрузка оператора "минус" - C++
Помогите дописать программу или исправить ее. Нужно было написать программу, где создать класс матрицы, используя двухмерный динамический...

Перегрузка оператора "+", чтобы выполнял "*" - C++
Ребят, привет всем, возник такой вопрос: возможно ли перегрузить оператор &quot;+&quot; так, чтоб выполнялось умножение? Например вводится...

Класс "Матрица", перегрузка оператора "+" - C++
Здравствуйте. Создаю класс матрица, в нём перегружаю оператор &quot;+&quot;. На этапе компиляции всё замечательно, но при запуске программа вылетает....

Класс "Дробь". Перегрузка оператора "==" - C++
template &lt;class T&gt; void polynomial&lt;T&gt;::refresh(){ //отбрасывающую старшие члены полинома с нулевыми коэффициентами int counter = 0;...

8
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
17.06.2013, 17:58 #2
Где конструктор копий?
0
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];
}
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
17.06.2013, 18:07 #4
И деструктор тоже и оператор присваивания. А лучше весь код.
Судя по ошибке где-то с new/delete, наверное, напутали.
0
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;
}
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
17.06.2013, 18:40 #6
Цитата Сообщение от Croessmah Посмотреть сообщение
А лучше весь код.
Весь код. Который можно скомпилировать и проверить.
0
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);
}
и ниже два инпута
0
Вложения
Тип файла: 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,
БИНГО
прошу прощения за не профессионализм, похоже, что не работало из-за отсутствия перегрузки оператора =
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2013, 19:25
Привет! Вот еще темы с ответами:

Перегрузка "оператора +" для сложения массива объектов - C++
Как перегрузить правильно оператор+ в данном случае или так делать нельзя? Ещё как-то туда надо передать размеры этого массива... и как...

Перегрузка оператора "<<" для вывода пользовательских классов - C++
Всем доброго времени суток. Пытаюсь сделать перегрузку оператора &quot;&lt;&lt;&quot; для того, чтобы можно было выводить объекты пользовательского класса...

Перегрузка операторов: Можно ли вынести "тело" оператора (расчеты) из H в CPP? - C++
Помогите новичку! Пишу класс и вынес его в отдельные файлы *.CPP и *.H Теперь пытаюсь переопределить операторы. Начал с = По примеру...

Перегрузка оператора вывода в классе "Время" - C++
Здравствуйте. Столкнулся с проблемой при работе с классом (Время), что выводит или чушь или вообще ничего не выводит. Прописал (вроде бы) 1...


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

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

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