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

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

Войти
Регистрация
Восстановить пароль
 
dzrkot
zzzZZZ...
518 / 348 / 53
Регистрация: 11.09.2013
Сообщений: 1,995
#1

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

29.01.2014, 16:59. Просмотров 423. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2014, 16:59     Перегрузка "operator =" для шаблона класса
Посмотрите здесь:

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

Перегрузка внешней функции операции "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++
Не могу найти ошибку, почему то числитель второй дроби увеличивается... Думал может что-то с конструкторами, но вроди все ок... Алгоритмы...

Перегрузка операторов: "operator #" - C++
Здравствуйте, подскажите пожалуйста. перегрузка оператора выглядит: void operator # (int i) В учебнике Шилдт перед словом operator...

Перегрузка operator<< для шаблонного класса - C++
Добрый день не могу понять как реализовать перегрузку &lt;&lt; для шаблонного класса template &lt;class T&gt; class List { public: ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
29.01.2014, 17:03     Перегрузка "operator =" для шаблона класса #2
dzrkot, оператор присваивания принимает константную ссылку на объект, копирует его поля в *this и возвращает ссылку на себя. Обычно так работает оператор присваивания
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
29.01.2014, 17:05     Перегрузка "operator =" для шаблона класса #3
Цитата Сообщение от dzrkot Посмотреть сообщение
C++
1
arraytp& operator=(const arraytp&); // ругается
не так ли?
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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...
518 / 348 / 53
Регистрация: 11.09.2013
Сообщений: 1,995
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!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 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...
518 / 348 / 53
Регистрация: 11.09.2013
Сообщений: 1,995
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!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 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...
518 / 348 / 53
Регистрация: 11.09.2013
Сообщений: 1,995
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
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
30.01.2014, 14:12     Перегрузка "operator =" для шаблона класса #15
dzrkot, во-первых, нет реализации конструктора по умолчанию.
Во-вторых, в main.cpp в 8 строке не объявление объекта, а объявление функции, которая возвращает arraytp<int , size>. Т.е. нужно убрать круглые скобки.
dzrkot
zzzZZZ...
518 / 348 / 53
Регистрация: 11.09.2013
Сообщений: 1,995
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++
Базовый класс: Taxi_Car.h: #pragma once #include&lt;string&gt; using namespace std; class Taxi_Car { string Marka;

Перегрузка "operator +" - C++
Прив, подскажите, как организовать перегрузку, чтобы работало, как надо. У меня такая проблема При перегрузке + оно сразу и...

Перегрузка "operator =" - C++
Не пойму чего возвращать из operator и так и так кручусь, умом не дохожу, помогите пожалуйста String_1&amp; String_1::operator =(String_1...

Перегрузка operator< для двух экземпляров класса отрезок - C++
Всем добра, в классе отрезок хочу перегрузить операцию &lt; правильно ли я сделал ? При этом отрезок с координатами x1=1 y1=1 и x2=4 y2=4...


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

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

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