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

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

Войти
Регистрация
Восстановить пароль
 
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
#1

Оператор присвоения для класса - C++

04.01.2014, 15:51. Просмотров 421. Ответов 12
Метки нет (Все метки)

Никак не получается написать оператор присвоения. Помогите пожалуйста!
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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
class Vector
{
private:
    int count;
    float* mass;
    static int c_obj;
public:
    Vector() { count = 1; mass = new float; mass = 0; c_obj++;}
    
    Vector(int n)
    {
       c_obj++;
       count = n;
       mass = new float[count];
       for(int i=0;i<count;i++)
          mass[i] = i;
    }
    
    Vector(int n, float* init)
    {
       c_obj++;
       count = n;
       mass = new float[count];
       for(int i=0;i<count;i++)
          mass[i] = init[i];          
    }
    
    ~Vector(){ if(count == 1) delete mass; else delete[]mass; c_obj--;}
    
    void PrintVec();
    void GetCountOfObject() { cout<<"Count of object: "<<c_obj<<endl; }
    
public:
       Vector(const Vector &copy); 
       Vector operator=(const Vector &copy);
};
 
int Vector::c_obj = 0;
 
void Vector::PrintVec()
{
   if(count == 1) cout<<mass<<endl;
   else
      for(int i=0;i<count;i++)
         cout<<mass[i]<<" ";
      cout<<endl;    
}
 
Vector::Vector(const Vector& copy)
{
   if(this->count == copy.count) 
       for(int i=0;i<count;i++)
          mass[i] = copy.mass[i];
   if(this->count > copy.count)
   {
      for(int i=0;i<count;i++)
      {
         if(copy.count<i) mass[i] = copy.mass[i];
         else mass[i] = 0;           
      }    
   }
   if(this->count < copy.count)
   {
      Vector v(this->count);
      for(int i=0;i<this->count;i++)
         v.mass[i] =  this->mass[i];
      delete [] this->mass;
      this->mass = new float[copy.count];
      for(int i=0;i<copy.count;i++)
      {
         if(this->count<i) this->mass[i] = v.mass[i];
         else this->mass[i] = 0;           
      }    
      this->count = copy.count;
   }
}
 
Vector Vector:: operator=(const Vector &copy)
{
    
    
                     
}
 
int main()
{
    float mass[5];
    for(int i=0;i<5;i++)
       mass[i] = rand()%10;
       
    Vector v(5,mass),t(5);
    v.PrintVec();
    t.PrintVec();
    t = v;
    t.PrintVec();
    
    getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2014, 15:51     Оператор присвоения для класса
Посмотрите здесь:

C++ Создать класс Str (символьная строка). Переопределить оператор присвоения.
C++ Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка
оператор присваивания для класса C++
C++ Перегрузить для класса оператор ==
Перегрузить для класса оператор == (много ошибок) C++
Как для класса написать перегруженный оператор new? C++
C++ С++ оператор присвоения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Miwa123
37 / 37 / 1
Регистрация: 16.04.2013
Сообщений: 317
Записей в блоге: 1
04.01.2014, 15:59     Оператор присвоения для класса #2
лень читать код. вот пример. если не разберешься. напиши ошибки какие летят у тебя
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class test
{
public:
    test(int number):num(number){};
    
    void operator =(test &b)
    {
        this->num=b.num;
    }
 
    int num;
};
int main()
{
    test abc(5);
    test xyz(10);
    abc=xyz;
    cout <<abc.num;
    system("pause");
}
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
04.01.2014, 16:01     Оператор присвоения для класса #3
vozup, rand с библиотеки <cstdlib>

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
Vector::Vector(const Vector& copy)
{
   this->operator=(copy);
}
 
Vector &Vector::operator=(const Vector &copy)
{
    if(this->count == copy.count)
       for(int i=0;i<count;i++)
          mass[i] = copy.mass[i];
   if(this->count > copy.count)
   {
      for(int i=0;i<count;i++)
      {
         if(copy.count<i) mass[i] = copy.mass[i];
         else mass[i] = 0;
      }
   }
   if(this->count < copy.count)
   {
      Vector v(this->count);
      for(int i=0;i<this->count;i++)
         v.mass[i] =  this->mass[i];
      delete [] this->mass;
      this->mass = new float[copy.count];
      for(int i=0;i<copy.count;i++)
      {
         if(this->count<i) this->mass[i] = v.mass[i];
         else this->mass[i] = 0;
      }
      this->count = copy.count;
   }
 
   return *this;
}
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
04.01.2014, 16:10  [ТС]     Оператор присвоения для класса #4
Спасибо, присвоение работает если количество є-ов одинаковое, а если разное не работает.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
04.01.2014, 16:21     Оператор присвоения для класса #5
Цитата Сообщение от vozup Посмотреть сообщение
одинаковое, а если разное не работает.
http://lmgtfy.com/?q=c%2B%2B+%20realloc
alsav22
5411 / 4807 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.01.2014, 16:22     Оператор присвоения для класса #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Vector::Vector(const Vector& copy)
{
    count = copy.count;
    mass = new float[count];
    for(int i = 0; i < count; i++)
        mass[i] = copy.mass[i];
}
 
Vector Vector::operator=(const Vector &copy)
{
    if (this == &copy) return *this;
    delete [] mass;
    count = copy.count;
    mass = new float[count];
    for(int i = 0; i < count; i++)
        mass[i] = copy.mass[i];
    
    return *this;             
}
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
04.01.2014, 16:29  [ТС]     Оператор присвоения для класса #7
Спасибо всем, дальше разобрался сам.
Вот код какой у меня получился, если интересно.
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
#include <iostream>
#include <conio.h>
#include <cstdlib>
 
using namespace std;
 
class Vector
{
private:
    int count;
    float* mass;
    static int c_obj;
public:
    Vector() { count = 1; mass = new float; mass = 0; c_obj++;}
    
    Vector(int n)
    {
       c_obj++;
       count = n;
       mass = new float[count];
       for(int i=0;i<count;i++)
          mass[i] = i;
    }
    
    Vector(int n, float* init)
    {
       c_obj++;
       count = n;
       mass = new float[count];
       for(int i=0;i<count;i++)
          mass[i] = init[i];          
    }
    
    ~Vector(){ if(count == 1) delete mass; else delete[]mass; c_obj--;}
    
    void PrintVec();
    void GetCountOfObject() { cout<<"Count of object: "<<c_obj<<endl; }
    
public:
       Vector(const Vector &copy); 
       Vector& operator=(const Vector &copy);
};
 
int Vector::c_obj = 0;
 
void Vector::PrintVec()
{
   if(count == 1) cout<<mass<<endl;
   else
      for(int i=0;i<count;i++)
         cout<<mass[i]<<" ";
      cout<<endl;    
}
 
Vector::Vector(const Vector& copy)
{
   this->operator=(copy);
}
 
Vector &Vector::operator=(const Vector &copy)
{
    if (this == &copy) return *this;
    if(this->count == copy.count)
       for(int i=0;i<count;i++)
          mass[i] = copy.mass[i];
          
   if(this->count > copy.count)
   {
      for(int i=0;i<count;i++)
      {
         if(copy.count>i) mass[i] = copy.mass[i];
      }
   }
   
   if(this->count < copy.count)
   {
      delete [] this->mass;
      this->count = copy.count;
      this->mass = new float[copy.count];
      
      for(int i=0;i<copy.count;i++)
      {
         if(this->count>i) this->mass[i] = copy.mass[i];
         else this->mass[i] = 0;
      }
   }
 
   return *this;
}
 
int main()
{
    float mass[7];
    for(int i=0;i<7;i++)
       mass[i] = rand()%10;
       
    Vector v(7,mass),t(10);
    v.PrintVec();
    t.PrintVec();
    t = v;
    t.PrintVec();
    
    getch();
    return 0;
}
alsav22
5411 / 4807 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.01.2014, 16:44     Оператор присвоения для класса #8
Цитата Сообщение от vozup Посмотреть сообщение
если интересно.
Не интересно.
Так не делают:
C++
1
2
3
4
Vector::Vector(const Vector& copy)
{
   this->operator=(copy);
}
Присваивание и копирование - разные вещи. Нельзя копирование заменять присваиванием. Копия - это копия: создаётся новое, в которое копируется старое. Присваивание подразумевает удаление старого значения, и присвоение нового.
Напишите вот так (чтобы сработал конструктор копирования) и будет ошибка:
C++
1
2
Vector v(7,mass),t(10);
Vector v2(v);
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
04.01.2014, 16:54  [ТС]     Оператор присвоения для класса #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Так не делают
Спасибо за критику, учту в дальнейшем!
alsav22
5411 / 4807 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.01.2014, 16:59     Оператор присвоения для класса #10
Цитата Сообщение от vozup Посмотреть сообщение
учту в дальнейшем!
В дальнейшем - это хорошо, но код кривой.
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
04.01.2014, 17:02  [ТС]     Оператор присвоения для класса #11
Цитата Сообщение от alsav22 Посмотреть сообщение
В дальнейшем - это хорошо, но код кривой.
Я же не профессиональный программист, я только учусь.
alsav22
5411 / 4807 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.01.2014, 17:31     Оператор присвоения для класса #12
Цитата Сообщение от vozup Посмотреть сообщение
Я же не профессиональный программист, я только учусь.
Я не об этом, а о том, что код нужно исправить. Код нерабочий.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2014, 17:40     Оператор присвоения для класса
Еще ссылки по теме:

Реализовать оператор присваивания для класса куб C++
C++ Шаблоны и оператор присвоения
C++ Реализовать оператор [] для класса String
C++ Оператор присвоения в бинарном дереве
Перегрузить оператор () для пользовательского класса Matrix C++

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

Или воспользуйтесь поиском по форуму:
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
04.01.2014, 17:40  [ТС]     Оператор присвоения для класса #13
Да код я исправлю это точно.
Yandex
Объявления
04.01.2014, 17:40     Оператор присвоения для класса
Ответ Создать тему
Опции темы

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