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

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

Войти
Регистрация
Восстановить пароль
 
 
dzrkot
zzzZZZ...
523 / 353 / 54
Регистрация: 11.09.2013
Сообщений: 2,036
#1

Перегрузка "operator =" для шаблона класса - C++

29.01.2014, 16:59. Просмотров 466. Ответов 16
Метки нет (Все метки)

как правильно перегрузить operator= для щаблона, по идее я принимаю 2 ссылки на объекты этого класса и возвращаю 1 из них ...
что-то не так

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
#ifndef ARRAYTP_H
#define ARRAYTP_H
#include <iostream>
#include <cstdlib>
 
template<class T, int n>
class arraytp
{
public:
    arraytp();
    explicit arraytp(const T&);
    virtual T& operator[](int i);
    virtual T operator[](int i) const;
    arraytp& operator=(arraytp& ,const arraytp&); // ругается
private:
    T ar[n];
};
 
template<class T, int n>
arraytp<T,n>::arraytp(const T& v)
{
for (int i=0;i<n;i++)
    ar[i]=v;
}
 
template<class T, int n>
T& arraytp<T,n>::operator[](int i)
{
    if (i<0||i>=n)
    {
        std::cerr<<"Error in array limit:"<<i<<" is out of range\n";
        std::exit(EXIT_FAILURE);
    }
    return ar[i];
}
 
template<class T, int n>
T arraytp<T,n>::operator[](int i) const
{
    if (i<0||i>=n)
    {
        std::cerr<<"Error in array limit:"<<i<<" is out of range\n";
        std::exit(EXIT_FAILURE);
    }
    return ar[i];
}
//template<class T, int n>
//arraytp& arraytp<T,n>::operator=(arraytp& obj1,const arraytp& obj2)
//{
//for (int i=0;i<obj2.n;i++)
//    obj1.ar[i]=obj2.ar[i];
//    return ?obj1;
//}
#endif // ARRAYTP_H
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2014, 16:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка "operator =" для шаблона класса (C++):

Перегрузка "opеrator =" и "{ }" для собственного класса - C++
Я пытаюсь создать класс Vector. Для задания элементов вектора хотелось бы использовать &quot;opеrator =&quot; и &quot; { } &quot;. Возможно ли...

Написать перегрузку operator+() для класса "Массив" - C++
Добрый день, Подскажите, как выйти правильно из ситуации: Array&amp; Array::operator+(const Array&amp; obj) { Array temp; ...

Перегрузка операторов для класса "множество целых чисел" - C++
Собственно, в этом и вопрос. Как перегрузить операторы &quot;+&quot; и &quot;-&quot; для объединение и разности двух множеств?

Класс "Дроби" и перегрузка операторов для этого класса - C++
Всем Доброго времени суток. Есть учебная задача по условиям которой необходимо реализовать класс &quot;Дроби&quot; и перегрузку операторов для...

Исправить ошибку компиляции "для использования класса шаблон требуется список аргументов шаблона" - C++
Решил создать класс List для задания двусвязного списка, и в самом начале компилятор начал ругаться на шаблон класса: error C2955:...

Перегрузка операторов (==, <<, >>, +) для класса "Денежная сумма" - C++
Реализовать класс «Денежная сумма». Данные класса: размер суммы, код валюты, курс по отношению к доллару. Операции: сложение двух сумм,...

16
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
29.01.2014, 17:03 #2
dzrkot, оператор присваивания принимает константную ссылку на объект, копирует его поля в *this и возвращает ссылку на себя. Обычно так работает оператор присваивания
1
aLarman
643 / 564 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
29.01.2014, 17:05 #3
Цитата Сообщение от dzrkot Посмотреть сообщение
C++
1
arraytp& operator=(const arraytp&); // ругается
не так ли?
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
29.01.2014, 17:07 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от metaluga145 Посмотреть сообщение
принимает константную ссылку на объект
при реализации идиомы copy-and-swap передают не по ссылке, а по значению.
1
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
29.01.2014, 17:10 #5
aLarman,
C++
1
template<class T, int n> arraytp& arraytp<T,n>::operator=(const arraytp&obj);
Вроде бы так
0
gray_fox
29.01.2014, 17:10
  #6

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
при реализации идиомы copy-and-swap передают не по ссылке, а по значению.
Не обязательно ведь, копию можно и внутри оператора создать)

0
dzrkot
zzzZZZ...
523 / 353 / 54
Регистрация: 11.09.2013
Сообщений: 2,036
29.01.2014, 17:11  [ТС] #7

Не по теме:

да что-то усталось о себе дает знать


теперь ругается в др месте

C++
1
2
3
4
5
6
7
8
9
10
...
arraytp& operator=(const arraytp&);
...
template<class T, int n>
arraytp& arraytp<T,n>::operator=(const arraytp& obj)  // здесь ошибка
{
for (int i=0;i<obj.n;i++)
    ar[i]=obj.ar[i];
    return *this;
}
0
aLarman
29.01.2014, 17:13
  #8

Не по теме:

Цитата Сообщение от metaluga145 Посмотреть сообщение
Вроде бы так
я имел ввиду синтаксис

0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
29.01.2014, 17:13 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от dzrkot Посмотреть сообщение
C++
1
2
template<class T, int n>
arraytp& arraytp<T,n>::operator=(const arraytp& obj)
C++
1
2
template<class T, int n>
arraytp<T, n>& arraytp<T,n>::operator=(const arraytp& obj)
2
dzrkot
zzzZZZ...
523 / 353 / 54
Регистрация: 11.09.2013
Сообщений: 2,036
29.01.2014, 17:16  [ТС] #10
Цитата Сообщение от gray_fox Посмотреть сообщение
C++
1
2
template<class T, int n>
arraytp<T, n>& arraytp<T,n>::operator=(const arraytp& obj)
спасибо, ох уж этот синтаксис ... странно что в аргументах не требуется arraytp<T, n>& вместе arraytp& ... как-то не логично для меня)
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
29.01.2014, 17:18 #11
Цитата Сообщение от dzrkot Посмотреть сообщение
транно что в аргументах не требуется arraytp<T, n>& вместе arraytp& ... как-то не логично для меня)
Можно и указать, просто в аргументах уже известны параметры шаблона, для которого определяется оператор.
1
Tulosba
29.01.2014, 17:35
  #12

Не по теме:

Цитата Сообщение от gray_fox Посмотреть сообщение
Не обязательно ведь, копию можно и внутри оператора создать)
зачем? это же лишний код.

0
gray_fox
29.01.2014, 19:05
  #13

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
это же лишний код.
Так то да.

0
dzrkot
zzzZZZ...
523 / 353 / 54
Регистрация: 11.09.2013
Сообщений: 2,036
30.01.2014, 14:07  [ТС] #14
так то вот, для объекта перегрузил., но если скажем в main будет:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include "arraytp.h"
 
using namespace std;
int main()
{
    const int size=5;
    arraytp<int , size> a();
    a[0]=3;
    return 0;
}
то он ругается, т.е. как вызвать []= не понятно, как-то заручивается на *this завязано вроде это ..?
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
#ifndef ARRAYTP_H
#define ARRAYTP_H
#include <iostream>
#include <cstdlib>
 
template<class T, int n>
class arraytp
{
public:
    arraytp();
    explicit arraytp(const T&);
    virtual T& operator[](int i);
    virtual T operator[](int i) const;
    arraytp& operator=(const arraytp&);
//    T operator=(T val)
//    {return val;}
private:
    T ar[n];
};
 
template<class T, int n>
arraytp<T,n>::arraytp(const T& v)
{
for (int i=0;i<n;i++)
    ar[i]=v;
}
 
template<class T, int n>
T& arraytp<T,n>::operator[](int i)
{
    if (i<0||i>=n)
    {
        std::cerr<<"Error in array limit:"<<i<<" is out of range\n";
        std::exit(EXIT_FAILURE);
    }
    return ar[i];
}
 
template<class T, int n>
T arraytp<T,n>::operator[](int i) const
{
    if (i<0||i>=n)
    {
        std::cerr<<"Error in array limit:"<<i<<" is out of range\n";
        std::exit(EXIT_FAILURE);
    }
    return ar[i];
}
 
template<class T, int n>
arraytp<T, n>& arraytp<T,n>::operator=(const arraytp<T, n>& obj)
{
for (int i=0;i<obj.n;i++)
    ar[i]=obj.ar[i];
return *this;
}
#endif // ARRAYTP_H
0
0x10
2486 / 1661 / 249
Регистрация: 24.11.2012
Сообщений: 4,136
30.01.2014, 14:12 #15
dzrkot, во-первых, нет реализации конструктора по умолчанию.
Во-вторых, в main.cpp в 8 строке не объявление объекта, а объявление функции, которая возвращает arraytp<int , size>. Т.е. нужно убрать круглые скобки.
1
30.01.2014, 14:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2014, 14:12
Привет! Вот еще темы с ответами:

Перегрузка внешней функции операции "operator=" - C++
1) Возможна ли перегрузка внешней функцией операции &quot;operator=&quot;? Чтобы скажем выполнить нечто: int = объект 2) Компилятор (mingw)...

Перегрузка операторов для класса "Матрица" - C++
Доброго времени суток. Помогите довести до ума код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;conio.h&quot; #include &quot;math.h&quot;...

Перегрузка операторов ==, !=, <, > для класса "Дробь" - C++
Не могу найти ошибку, почему то числитель второй дроби увеличивается... Думал может что-то с конструкторами, но вроди все ок... Алгоритмы...

Определение класса, описывающего комплексное число. Перегрузка для него бинарного оператора "*" - C++
1. Определить класс, описывающий комплексное число. Для класса перегрузить бинарный оператор *. Написать программу, в которой используется...


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

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

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