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

оператор присваивания - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
besh]<a
 Аватар для besh]<a
12 / 10 / 1
Регистрация: 02.11.2009
Сообщений: 194
30.09.2010, 20:18     оператор присваивания #1
Подскажите пожалуйста, вот я создал класс, конструктор которого создает 2хмерный массив из 2ойного указателя, являющейся членом этого класса.
Вобще что то не могу понять как работает перегрузка операции присваивания. Возвращаемое значение и будет присвоенным, а параметры зачем?... Напишите плз правильный синтаксис перегрузки этого оператора
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2010, 20:18     оператор присваивания
Посмотрите здесь:

C++ Оператор присваивания и деструктор
Оператор присваивания C++
оператор присваивания C++
Оператор присваивания. C++
Оператор присваивания в c++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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;
}
Adler
 Аватар для Adler
78 / 78 / 3
Регистрация: 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;}
}
besh]<a
 Аватар для besh]<a
12 / 10 / 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)'
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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;
}
А какой смысл булевой матрицы, если не секрет?
Adler
 Аватар для Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
30.09.2010, 20:53     оператор присваивания #6
C++
1
GrafMatr& operator = (const GrafMatr& nmatr);
а так?
besh]<a
 Аватар для besh]<a
12 / 10 / 1
Регистрация: 02.11.2009
Сообщений: 194
30.09.2010, 21:00  [ТС]     оператор присваивания #7
в универе, работаем с графами, у них есть матричное представление, дана формула(с булевыми операциями) для выяснения связанный граф или нет, вот решил таким образом реализовать
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.09.2010, 21:09     оператор присваивания #8
besh]<a, Сейчас. Доделаю.
besh]<a
 Аватар для besh]<a
12 / 10 / 1
Регистрация: 02.11.2009
Сообщений: 194
30.09.2010, 21:10  [ТС]     оператор присваивания #9
Спасибо всем, операция присваивания заработала.
Оказалось, что не работает операция ИЛИ, вылазит ошибка Access Violation, я думаю изза локальных переменных, потому что показывает на мой деструктор...

что доделаете, ненадо спасибо, я сам)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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;
}
besh]<a
 Аватар для besh]<a
12 / 10 / 1
Регистрация: 02.11.2009
Сообщений: 194
30.09.2010, 21:36  [ТС]     оператор присваивания #11
не может выполнить операцию или, вылетает с той же ошибкой...
C++
1
matr3=matr2|matr1;
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.09.2010, 21:40     оператор присваивания #12
besh]<a, В моем коде работает. Про ваш к сожалению ничего сказать не могу (не знаю как и что вы изменили). Там скорее всего вызывается деструктор до реторна из функции.
Поэтому нужно переопределить оператор: |=, и через него оператор |.
А так же будет нужен конструктор копирования и скорее всего функция установки размера.
besh]<a
 Аватар для besh]<a
12 / 10 / 1
Регистрация: 02.11.2009
Сообщений: 194
30.09.2010, 22:47  [ТС]     оператор присваивания #13
Не знаю, при запуске вашего кода, таже самая ошибка что и у меня, а именно Access Violation.
Мне тоже кажется что деструктор вызывается до реторна.
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,946
30.09.2010, 22:52     оператор присваивания #14
GrafMatr& GrafMatr::operator=(GrafMatr &nmatr)
может вопрос не в тему, но почему возвращается ссылка на объект. Писал возвращение просто объекта и все работало, а оказывается это ошибка. По идее же можно хоть войд возвращать, главное же что мы объект меняем.
besh]<a
 Аватар для besh]<a
12 / 10 / 1
Регистрация: 02.11.2009
Сообщений: 194
30.09.2010, 22:56  [ТС]     оператор присваивания #15
Цитата Сообщение от KuKu Посмотреть сообщение
Писал возвращение просто объекта и все работало, а оказывается это ошибка.
Обьясните пожалуйста, это как? Вылетело с ошибкой?
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,946
30.09.2010, 23:00     оператор присваивания #16
Цитата Сообщение от besh]<a Посмотреть сообщение
Обьясните пожалуйста, это как? Вылетело с ошибкой?
Не вылетело с ошибкой, а насколько помню при return(*this) вызывался оператор копирования и текла память или что то типа. В этом не разобрался поэтому и спрашиваю
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
30.09.2010, 23:08     оператор присваивания #17
Цитата Сообщение от KuKu Посмотреть сообщение
может вопрос не в тему, но почему возвращается ссылка на объект.
Это эффективнее - если возвращать объект по значению, то будет вызван конструктор копирования.
Цитата Сообщение от KuKu Посмотреть сообщение
По идее же можно хоть войд возвращать, главное же что мы объект меняем.
В таком случае отвалятся выражения вида:
C++
1
obj1 = obj2 = obj3;
besh]<a
 Аватар для besh]<a
12 / 10 / 1
Регистрация: 02.11.2009
Сообщений: 194
01.10.2010, 00:36  [ТС]     оператор присваивания #18
Lavroff, продблему решил, создав глобальную переменную в файле GrafMatr.cpp где описывались методы класса + добавил посоветованную вами функцию Resize. Теперь каждый раз используется глобальная переменная вместо локальной. Спастбо вам еще раз!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2010, 00:40     оператор присваивания
Еще ссылки по теме:

Оператор присваивания C++
Оператор присваивания C++
Перегруженный оператор присваивания C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.10.2010, 00:40     оператор присваивания #19
besh]<a, Плохое решение. Глобальные переменные - зло.
Yandex
Объявления
01.10.2010, 00:40     оператор присваивания
Ответ Создать тему
Опции темы

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