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

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

Восстановить пароль Регистрация
 
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,993
29.01.2014, 16:59     Перегрузка "operator =" для шаблона класса #1
как правильно перегрузить 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
29.01.2014, 17:03     Перегрузка "operator =" для шаблона класса #2
dzrkot, оператор присваивания принимает константную ссылку на объект, копирует его поля в *this и возвращает ссылку на себя. Обычно так работает оператор присваивания
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
29.01.2014, 17:05     Перегрузка "operator =" для шаблона класса #3
Цитата Сообщение от dzrkot Посмотреть сообщение
C++
1
arraytp& operator=(const arraytp&); // ругается
не так ли?
Tulosba
:)
Эксперт С++
4382 / 3225 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.01.2014, 17:07     Перегрузка "operator =" для шаблона класса #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от metaluga145 Посмотреть сообщение
принимает константную ссылку на объект
при реализации идиомы copy-and-swap передают не по ссылке, а по значению.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
29.01.2014, 17:10     Перегрузка "operator =" для шаблона класса #5
aLarman,
C++
1
template<class T, int n> arraytp& arraytp<T,n>::operator=(const arraytp&obj);
Вроде бы так
gray_fox
29.01.2014, 17:10
  #6

Не по теме:

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

dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,993
29.01.2014, 17:11  [ТС]     Перегрузка "operator =" для шаблона класса #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;
}
aLarman
29.01.2014, 17:13
  #8

Не по теме:

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

gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
29.01.2014, 17:13     Перегрузка "operator =" для шаблона класса #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)
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,993
29.01.2014, 17:16  [ТС]     Перегрузка "operator =" для шаблона класса #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& ... как-то не логично для меня)
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
29.01.2014, 17:18     Перегрузка "operator =" для шаблона класса #11
Цитата Сообщение от dzrkot Посмотреть сообщение
транно что в аргументах не требуется arraytp<T, n>& вместе arraytp& ... как-то не логично для меня)
Можно и указать, просто в аргументах уже известны параметры шаблона, для которого определяется оператор.
Tulosba
29.01.2014, 17:35
  #12

Не по теме:

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

gray_fox
29.01.2014, 19:05
  #13

Не по теме:

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

dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,993
30.01.2014, 14:07  [ТС]     Перегрузка "operator =" для шаблона класса #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
0x10
2437 / 1609 / 235
Регистрация: 24.11.2012
Сообщений: 3,949
30.01.2014, 14:12     Перегрузка "operator =" для шаблона класса #15
dzrkot, во-первых, нет реализации конструктора по умолчанию.
Во-вторых, в main.cpp в 8 строке не объявление объекта, а объявление функции, которая возвращает arraytp<int , size>. Т.е. нужно убрать круглые скобки.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,993
30.01.2014, 14:34  [ТС]     Перегрузка "operator =" для шаблона класса #16
Цитата Сообщение от 0x10 Посмотреть сообщение
dzrkot, во-первых, нет реализации конструктора по умолчанию.
Во-вторых, в main.cpp в 8 строке не объявление объекта, а объявление функции, которая возвращает arraytp<int , size>. Т.е. нужно убрать круглые скобки.
блин, точно, я невнимателен, не там искал)

Добавлено через 17 минут
а как-нибудь реализовать инициализацию с помощью {} возможно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2014, 14:36     Перегрузка "operator =" для шаблона класса
Еще ссылки по теме:

Перегрузка operator>> для производного класса C++
C++ Написать перегрузку operator+() для класса "Массив"
C++ Перегрузить operator<<() для шаблонного класса (перегрузка оператора вывода)
C++ Перегрузка операторов ==, !=, <, > для класса "Дробь"
C++ Перегрузка операторов: "operator #"

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

Или воспользуйтесь поиском по форуму:
0x10
2437 / 1609 / 235
Регистрация: 24.11.2012
Сообщений: 3,949
30.01.2014, 14:36     Перегрузка "operator =" для шаблона класса #17
Цитата Сообщение от dzrkot Посмотреть сообщение
а как-нибудь реализовать инициализацию с помощью {} возможно?
С++11: http://www.cplusplus.com/reference/i...tializer_list/
Yandex
Объявления
30.01.2014, 14:36     Перегрузка "operator =" для шаблона класса
Ответ Создать тему
Опции темы

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