Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
1

оператор присваивания

30.09.2010, 20:18. Просмотров 1149. Ответов 18
Метки нет (Все метки)

Подскажите пожалуйста, вот я создал класс, конструктор которого создает 2хмерный массив из 2ойного указателя, являющейся членом этого класса.
Вобще что то не могу понять как работает перегрузка операции присваивания. Возвращаемое значение и будет присвоенным, а параметры зачем?... Напишите плз правильный синтаксис перегрузки этого оператора
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2010, 20:18
Ответы с готовыми решениями:

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор *
Помогите в следующем: Для класса шаблона следует перегрузить оператор...

оператор присваивания
Привет всем ! Каким образом вызывается оператор присваивания, например, здесь:...

Оператор присваивания
Добрый день! Помогите, пожалуйста, разобраться. Я не совсем понимаю работу...

Оператор присваивания в c++
Такой вопрос, для каких классов следует явно перегрузить оператор присваивания??

Оператор присваивания
Какая разница между оператором &quot;=&quot; и &quot;==&quot; Почему , например , в цикле нужно...

18
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.09.2010, 20:22 2
besh]<a,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SomeClass& SomeClass::operator =(const SomeClass& Ob)
{ 
     if(this==&Ob)
          return *this;
     resize(Ob.n, Ob.m);//Меняем размер для *this. Так же в нем может быть локальная очистка памяти.
     for(int i=0; i<Ob.n; ++i)
     {
         for(int j=0; j<Ob.m; ++j)
         {
             Matrix[i][j]=Ob.Matrix[i][j];
         }
     }
     return *this;
}
0
Adler
79 / 79 / 19
Регистрация: 07.05.2009
Сообщений: 316
30.09.2010, 20:22 3
держи:
C++
1
2
3
4
5
6
class vec2d
{
public:
  double x,y;
  vec2d& operator = (const vec2d& v){x=v.x; y=v.y; return *this;}
}
0
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
30.09.2010, 20:46  [ТС] 4
думал обойдусь теорией, не работает пока...
вот мой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class GrafMatr
{
     private:
       bool **m;
       int n;
     public:
       GrafMatr(int bn);
       ~GrafMatr();
       friend istream & operator>>(istream &is, GrafMatr &gmatr);
       friend ostream & operator<<(ostream &os, GrafMatr &gmatr);
       GrafMatr operator|(GrafMatr &nmatr) const;
       GrafMatr operator=(GrafMatr &nmatr); 
 
};
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
#include "GrafMatr.h"
 
 
GrafMatr::GrafMatr(int bn)
   {
      this->n=bn;
      this->m=new bool*[bn];
      for(int i=0;i<n;i++) this->m[i]=new bool[n];
   }
 
GrafMatr::~GrafMatr()
   {
      for(int i=1;i<this->n;i++)delete[]this->m[i];
      delete[]this->m;
   }
////////////////////////////////////////////////////////////////////////////////////////////////////////////
// вот не работающие операторы
GrafMatr GrafMatr::operator|(GrafMatr &nmatr) const
   {
      GrafMatr RetMatr(this->n);
      for(int j=0;j<this->n;j++)
        for(int i=0;i<this->n;i++)
               RetMatr.m[j][i]=this->m[j][i]|nmatr.m[j][i];
 
      return RetMatr;
   }
 
GrafMatr GrafMatr::operator=(GrafMatr &nmatr)
{
      for(int j=0;j<nmatr.n;j++)
        for(int i=0;i<nmatr.n;i++)
               this->m[j][i]=nmatr.m[j][i];
      return *this;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
istream & operator>>(istream &is, GrafMatr &gmatr)
   {
     int buf;
     for(int j=0;j<gmatr.n;j++)
        for(int i=0;i<gmatr.n;i++)
         {
          is>>buf;
          if(buf>=1)gmatr.m[j][i]=1; else gmatr.m[j][i]=0;
         }
   }
 
ostream & operator<<(ostream &os, GrafMatr &gmatr)
   {
     for(int j=0;j<gmatr.n;j++)
        {
          for(int i=0;i<gmatr.n;i++) os<<gmatr.m[j][i]<<" ";;
          os<<"\n";
        }
   }
вылазит ошибка при такой конструкции:
C++
1
2
3
GrafMatr matr1(2),matr2(2),matr3(2);
.....
matr3=matr1|matr2;
[BCC32 Error] File1.cpp(18): E2285 Could not find a match for 'operator GrafMatr::=(GrafMatr)'
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.09.2010, 20:51 5
C++
1
2
3
4
5
6
7
GrafMatr& GrafMatr::operator=(const GrafMatr &nmatr)
{
          for(int j=0;j<nmatr.n;j++)
                for(int i=0;i<nmatr.n;i++)
                           this->m[j][i]=nmatr.m[j][i];
          return *this;
}
А какой смысл булевой матрицы, если не секрет?
1
Adler
79 / 79 / 19
Регистрация: 07.05.2009
Сообщений: 316
30.09.2010, 20:53 6
C++
1
GrafMatr& operator = (const GrafMatr& nmatr);
а так?
1
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
30.09.2010, 21:00  [ТС] 7
в универе, работаем с графами, у них есть матричное представление, дана формула(с булевыми операциями) для выяснения связанный граф или нет, вот решил таким образом реализовать
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.09.2010, 21:09 8
besh]<a, Сейчас. Доделаю.
0
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
30.09.2010, 21:10  [ТС] 9
Спасибо всем, операция присваивания заработала.
Оказалось, что не работает операция ИЛИ, вылазит ошибка Access Violation, я думаю изза локальных переменных, потому что показывает на мой деструктор...

что доделаете, ненадо спасибо, я сам)
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.09.2010, 21:12 10
Не особо красиво конечно. Но вроде как работает.
Может собсна на код не смотреть если хотите сами=)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class GrafMatr
{
         private:
           bool **m;
           int n;
         public:
           GrafMatr(int bn);
           ~GrafMatr();
           GrafMatr(const GrafMatr& nmatr);
           void Resize(int m);
       friend std::istream & operator>>(std::istream &is, GrafMatr &gmatr);
           friend std::ostream & operator<<(std::ostream &os, GrafMatr &gmatr);
           GrafMatr& operator|=(GrafMatr &nmatr);
           GrafMatr operator|(GrafMatr& nmatr) const;
           GrafMatr& operator=(GrafMatr &nmatr); 
};
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
106
#include <iostream>
 
#include "GrafMatr.h"
 
GrafMatr::GrafMatr(const GrafMatr& nmatr)
{
    if(n<0)
        n=0;
    Resize(nmatr.n);
    for(int i=0; i<n; ++i)
    {
        for(int j=0; j<n; ++j)
        {
            m[i][j]=nmatr.m[i][j];
        }
    }
}
 
void GrafMatr::Resize(int z)
{
    if(n!=0)
    {
        for(int i=0; i<n; ++i)
        {
            delete[] m[i];
        }
        delete[] m;
    }
    n=z;
    m=new bool*[z];
    for(int i=0; i<z; ++i)
        m[i]=new bool[z];
}
 
GrafMatr::GrafMatr(int bn)
   {
          this->n=bn;
          this->m=new bool*[bn];
          for(int i=0;i<n;i++) this->m[i]=new bool[n];
   }
 
GrafMatr::~GrafMatr()
   {
          for(int i=1;i<this->n;i++)delete[]this->m[i];
          delete[]this->m;
   }
////////////////////////////////////////////////////////////////////////////////////////////////////////////
// вот не работающие операторы
GrafMatr& GrafMatr::operator|=(GrafMatr &nmatr)
{
      GrafMatr RetMatr(this->n);
      for(int j=0;j<this->n;j++)
         for(int i=0;i<this->n;i++)
            RetMatr.m[j][i]=this->m[j][i]|nmatr.m[j][i];
 
      *this=RetMatr;
      return *this;
}
 
 
GrafMatr GrafMatr::operator |(GrafMatr& nmatr) const
{
    GrafMatr Temp(*this);
    Temp|=nmatr;
    return Temp;
}
GrafMatr& GrafMatr::operator=(GrafMatr &nmatr)
{
          for(int j=0;j<nmatr.n;j++)
                for(int i=0;i<nmatr.n;i++)
                           this->m[j][i]=nmatr.m[j][i];
          return *this;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
std::istream & operator>>(std::istream &is, GrafMatr &gmatr)
   {
         int buf;
         for(int j=0;j<gmatr.n;j++)
                for(int i=0;i<gmatr.n;i++)
                 {
                  is>>buf;
                  if(buf>=1)gmatr.m[j][i]=1; else gmatr.m[j][i]=0;
                 }
                return is;
   }
 
std::ostream & operator<<(std::ostream &os, GrafMatr &gmatr)
   {
         for(int j=0;j<gmatr.n;j++)
                {
                  for(int i=0;i<gmatr.n;i++) os<<gmatr.m[j][i]<<" ";;
                  os<<"\n";
                }
         return os;
   }
 
 
int main()
{
    GrafMatr matr1(2),matr2(2),matr3(2);
    std::cin>>matr1;
    std::cin>>matr2;
    matr3=matr1|matr2;
    std::cout<<matr3;
    return 0;
}
0
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
30.09.2010, 21:36  [ТС] 11
не может выполнить операцию или, вылетает с той же ошибкой...
C++
1
matr3=matr2|matr1;
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.09.2010, 21:40 12
besh]<a, В моем коде работает. Про ваш к сожалению ничего сказать не могу (не знаю как и что вы изменили). Там скорее всего вызывается деструктор до реторна из функции.
Поэтому нужно переопределить оператор: |=, и через него оператор |.
А так же будет нужен конструктор копирования и скорее всего функция установки размера.
0
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
30.09.2010, 22:47  [ТС] 13
Не знаю, при запуске вашего кода, таже самая ошибка что и у меня, а именно Access Violation.
Мне тоже кажется что деструктор вызывается до реторна.
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
30.09.2010, 22:52 14
GrafMatr& GrafMatr::operator=(GrafMatr &nmatr)
может вопрос не в тему, но почему возвращается ссылка на объект. Писал возвращение просто объекта и все работало, а оказывается это ошибка. По идее же можно хоть войд возвращать, главное же что мы объект меняем.
0
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
30.09.2010, 22:56  [ТС] 15
Цитата Сообщение от KuKu Посмотреть сообщение
Писал возвращение просто объекта и все работало, а оказывается это ошибка.
Обьясните пожалуйста, это как? Вылетело с ошибкой?
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
30.09.2010, 23:00 16
Цитата Сообщение от besh]<a Посмотреть сообщение
Обьясните пожалуйста, это как? Вылетело с ошибкой?
Не вылетело с ошибкой, а насколько помню при return(*this) вызывался оператор копирования и текла память или что то типа. В этом не разобрался поэтому и спрашиваю
0
CyBOSSeR
Эксперт С++
2311 / 1684 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
30.09.2010, 23:08 17
Цитата Сообщение от KuKu Посмотреть сообщение
может вопрос не в тему, но почему возвращается ссылка на объект.
Это эффективнее - если возвращать объект по значению, то будет вызван конструктор копирования.
Цитата Сообщение от KuKu Посмотреть сообщение
По идее же можно хоть войд возвращать, главное же что мы объект меняем.
В таком случае отвалятся выражения вида:
C++
1
obj1 = obj2 = obj3;
1
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
01.10.2010, 00:36  [ТС] 18
Lavroff, продблему решил, создав глобальную переменную в файле GrafMatr.cpp где описывались методы класса + добавил посоветованную вами функцию Resize. Теперь каждый раз используется глобальная переменная вместо локальной. Спастбо вам еще раз!
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
01.10.2010, 00:40 19
besh]<a, Плохое решение. Глобальные переменные - зло.
0
01.10.2010, 00:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2010, 00:40

Оператор присваивания
Почему в этом случае вызывается оператор присваивания Fraction f4; ...

Оператор присваивания
Здравствуйте! Есть класс, в котором перегружены операции сложения и...

Оператор присваивания.
Всем привет!В универе щас работаем с классами и перегрузками.В частности...


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

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

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