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

Перегрузка оператора ++ - C++

Восстановить пароль Регистрация
 
spiderasp
0 / 0 / 0
Регистрация: 23.04.2013
Сообщений: 3
23.04.2013, 16:52     Перегрузка оператора ++ #1
Нужно создать операторы префиксного и постфиксного инкремента для приращения переменной itsRadius класса SimpleCircle. Переменная itsRadius должна размещаться в динамической памяти.

Вот моя попытка реализовать, но там ерунда получается :
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
#include <iostream>
 
class SimpleCircle
{
public:
    SimpleCircle();
    SimpleCircle(int radius);
    ~SimpleCircle() {}
    int GetRadius() {return *itsRadius;}
    void SetRadius(int radius) { *itsRadius = radius;}
    const SimpleCircle & operator++ ();
    const SimpleCircle operator++ (int);
 
private:
    int *itsRadius;
};
 
SimpleCircle::SimpleCircle()
{
    itsRadius = new int (5);
}
 
SimpleCircle::SimpleCircle(int radius)
{
    itsRadius = new int (radius);
}
 
const SimpleCircle & SimpleCircle::operator++()
{
    ++(itsRadius);
    return *this;
}
 
const SimpleCircle SimpleCircle::operator++(int)
{   
    SimpleCircle temp(*this);
    ++(itsRadius);
    return temp;
}
 
 
int main()
{
    using namespace std;
    SimpleCircle Round;
    SimpleCircle Round_2(1);
    SimpleCircle Round_3(2);
 
    cout << Round.GetRadius() << endl;
    cout << Round_2.GetRadius() << endl;
    cout << Round_3.GetRadius() << endl;
    
    Round_2 = ++Round;
    Round_3 = ++Round;
 
    cout << Round.GetRadius() << endl;
    cout << Round_2.GetRadius() << endl;
    cout << Round_3.GetRadius() << endl;
    
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2013, 16:52     Перегрузка оператора ++
Посмотрите здесь:

C++ Перегрузка оператора +=
Перегрузка оператора = C++
Перегрузка оператора * C++
Перегрузка оператора ~ C++
C++ Перегрузка оператора <<
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
23.04.2013, 17:25     Перегрузка оператора ++ #2
С какой целью свойство радиус сделано указателем? Если бесцельно, то проще без него:
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
#include <iostream>
 
class SimpleCircle {
 public:
  SimpleCircle() : radius(0) {}
  SimpleCircle(int radius) : radius(radius) {}
  int getRadius() const { return radius; }
  void setRadius(int radius) { this->radius = radius; }
 private:
  int radius;
};
 
// префиксный инкремент
SimpleCircle &operator++(SimpleCircle &circle) {
  circle.setRadius(circle.getRadius() + 1);
  return circle;
}
 
// постфиксный инкремент
SimpleCircle operator++(SimpleCircle &circle, int) {
  SimpleCircle result = circle;
  circle.setRadius(circle.getRadius() + 1);
  return result;
}
 
std::ostream &operator<<(std::ostream &stream, const SimpleCircle &circle) {
  return stream << "Circle{radius=" << circle.getRadius() << "}";
}
 
int main(int argc, char **argv) {
  SimpleCircle a = 10;
  
  std::cout << a++ << std::endl; // 10
  std::cout << a << std::endl;   // 11
  std::cout << ++a << std::endl; // 12
  
  return 0;
}
spiderasp
0 / 0 / 0
Регистрация: 23.04.2013
Сообщений: 3
23.04.2013, 17:28  [ТС]     Перегрузка оператора ++ #3
Я понимаю, что проще, и знаю как сделать, но в задании сказано : "Переменная itsRadius должна размещаться в динамической памяти." Вот такая беда =/
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
23.04.2013, 17:30     Перегрузка оператора ++ #4
Если вам указатель дорог как память, то нужно добавить конструктор копирования и оператор присваивания.
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
#include <iostream>
 
class SimpleCircle {
 public:
  SimpleCircle() : radius(new int()) {}
  SimpleCircle(int radius) : radius(new int(radius)) {}
  SimpleCircle(const SimpleCircle &other)
    : radius(new int(other.getRadius())) {}
  SimpleCircle &operator=(const SimpleCircle &other) {
    if (this != &other) {
      setRadius(other.getRadius());
    }
    return *this;
  }
  virtual ~SimpleCircle() {
    delete radius;
  }
  int getRadius() const { return *radius; }
  void setRadius(int radius) { *(this->radius) = radius; }
 private:
  int *radius;
};
 
// префиксный инкремент
SimpleCircle &operator++(SimpleCircle &circle) {
  circle.setRadius(circle.getRadius() + 1);
  return circle;
}
 
// постфиксный инкремент
SimpleCircle operator++(SimpleCircle &circle, int) {
  SimpleCircle result = circle;
  circle.setRadius(circle.getRadius() + 1);
  return result;
}
 
std::ostream &operator<<(std::ostream &stream, const SimpleCircle &circle) {
  return stream << "Circle{radius=" << circle.getRadius() << "}";
}
 
int main(int argc, char **argv) {
  SimpleCircle a = 10;
  
  std::cout << a++ << std::endl; // 10
  std::cout << a << std::endl;   // 11
  std::cout << ++a << std::endl; // 12
  
  return 0;
}
Yandex
Объявления
23.04.2013, 17:30     Перегрузка оператора ++
Ответ Создать тему
Опции темы

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