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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
besh]<a
13 / 11 / 1
Регистрация: 02.11.2009
Сообщений: 194
#1

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

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

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

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

Оператор присваивания - C++
Почему в этом случае вызывается оператор присваивания Fraction f4; f4 = f1+f2+f3; а в другом не вызывается: ...

Оператор присваивания. - C++
Всем привет!В универе щас работаем с классами и перегрузками.В частности перегрузкой оператора присваивания и индексации.И я в упор не...

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

оператор присваивания - C++
Привет всем ! Каким образом вызывается оператор присваивания, например, здесь: a = &quot;I &quot;; если в аргументе char*, а в операторе...

Оператор присваивания - C++
Какая разница между оператором &quot;=&quot; и &quot;==&quot; Почему , например , в цикле нужно писать while(count==1) а не ...

18
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 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
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;}
}
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
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 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
78 / 78 / 3
Регистрация: 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
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 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
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 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
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 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
1558 / 1036 / 78
Регистрация: 17.04.2009
Сообщений: 2,988
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
30.09.2010, 22:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2010, 22:56
Привет! Вот еще темы с ответами:

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

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

Оператор присваивания и деструктор - C++
Вопрос: почему в 52 строке Access violation? Если убрать строку 50, все будет нормально. #include &lt;iostream&gt; using namespace std; ...

Перегруженный оператор присваивания - C++
Достаточно информации прочитал, что такое перегруж. оператор присваивания, но не до конца понимаю суть данного вопроса - &quot;в каком месте...


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

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

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