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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
#1

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

11.08.2011, 19:11. Просмотров 2269. Ответов 33
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class String
{
  char *mData;
  static const int c_size = 100;
  String();
  String & operator+=(const String & s)
  {
         strcat(mData,s.mData);
         return *this;
  }
    String & operator+=(const char & ch)
  { 
     
        return *this;
  }
}
имея класс переопределил оператор +=, но чтобы он мог принять аргумент типа char(символьную константу) но вопрос как провести преобразование?
String s2 += '?';
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2011, 19:11     Переопределение оператора в классе
Посмотрите здесь:

Переопределение оператора == - C++
Здравствуйте. Такая проблема: для поиска требуется сравнить два числа(в 1-ом случае инты, во 2-ом даблы). Для интов все отлично, а для...

Переопределение оператора== - C++
Создал функцию-операцию == для экземпляров класса, однако при выполнении данного кода Trigger.h #pragma once #include...

Переопределение оператора - C++
У меня есть класс вектора. Надо переопределить оператор умножения числа на вектор. class myvector { private: int x,y,z; public:...

Переопределение оператора ++ - C++
Необходимо переопределить оператор ++ в классе IteratorBase так, чтобы при этом вызывалась функция next(). template <class T> ...

Переопределение оператора ввода - C++
struct info { int num; string kuda; string type; double cena; int count; }; ifstream &operator >>(ifstream &inp, info...

Переопределение оператора присваивания - C++
Имеется такой простой класс: class TClass { private: float* A; int N; public: TClass(int _N) ...

Переопределение оператора инкремента - C++
В теле класса "Сlocks" описали: Clocks& operator ++(); // Prefix increment operator. Clocks operator ++(int); // Postfix...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 19:39     Переопределение оператора в классе #2
Я думаю что в твоем случае это будет выглядеть так:
C++
1
2
3
n = strlen( mData );
mData[n] = ch;
mData[n + 1] = '\0';
* кстати это переопределение называется перегрузкой оператора.
silent_1991
Эксперт С++
4961 / 3037 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 19:43     Переопределение оператора в классе #3
Можно в классе написать конструктор, принимающий char, и тогда вообще ничего дописывать не надо - будет произведено автоматическое преобразование типа и подойдёт уже написанный оператор для двух String'ов.

Добавлено через 50 секунд
lazybiz, а выход за массив не рассматриваем?))
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 19:46     Переопределение оператора в классе #4
Цитата Сообщение от silent_1991 Посмотреть сообщение
lazybiz, а выход за массив не рассматриваем?))
Нет. Исходя из того что автор поста в описании первого оператора его не рассматривает я написал по-аналогии
Я лишь ответил на его вопрос, а нужна ли ему проверка или нет меня меньше всего волнует) Если хочешь то можешь у него об этом спросить) Таково мое мнение
silent_1991
Эксперт С++
4961 / 3037 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 20:00     Переопределение оператора в классе #5
lazybiz, да мне тоже не особо интересно, но если уж взялся помогать, то хотя бы на словах поясню, какие могут быть проблемы и как примерно их решать. Таково моё мнение.
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
11.08.2011, 20:05  [ТС]     Переопределение оператора в классе #6
Цитата Сообщение от silent_1991 Посмотреть сообщение
Можно в классе написать конструктор, принимающий char, и тогда вообще ничего дописывать не надо - будет произведено автоматическое преобразование типа и подойдёт уже написанный оператор для двух String'ов.

Добавлено через 50 секунд
lazybiz, а выход за массив не рассматриваем?))
Да и правда так можно. Не подскажете как такой конструктор соорудить?
Сыроежка
Заблокирован
11.08.2011, 20:06     Переопределение оператора в классе #7
Цитата Сообщение от SatOleg Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class String
{
  char *mData;
  static const int c_size = 100;
  String();
  String & operator+=(const String & s)
  {
         strcat(mData,s.mData);
         return *this;
  }
    String & operator+=(const char & ch)
  { 
     
        return *this;
  }
}
имея класс переопределил оператор +=, но чтобы он мог принять аргумент типа char(символьную константу) но вопрос как провести преобразование?
String s2 += '?';
Я думаю, что вы хотели перегрузить оператор не для константной ссылки на символ, а для символьного массива. Тогда правльное объявление этого оператора будет выглядеть так

C++
1
String & operator+=(const char *str );
Кроме того, вы все-таки должны проверять размер результирующей строки, иначе выйдете за границу выделенной памяти. Поэтому чледует использовать не функцию strcat, а функцию strncat, в которую передавать размер копируемой строки, который не превосходит размер исходного буфера, выделенного внутри вашего класса.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 20:18     Переопределение оператора в классе #8
silent_1991, Давай мы не будем вступать в глубоко-интеллектуальные дискуссии. Какой был вопрос - такой и ответ. (точка большая и жирная)

Добавлено через 8 минут
Цитата Сообщение от silent_1991 Посмотреть сообщение
Можно в классе написать конструктор, принимающий char, и тогда вообще ничего дописывать не надо - будет произведено автоматическое преобразование типа и подойдёт уже написанный оператор для двух String'ов.
Кстати поподробней. Не совсем понял что ты имеешь в виду.
silent_1991
Эксперт С++
4961 / 3037 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 21:04     Переопределение оператора в классе #9
lazybiz,
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
#include <iostream>
 
class Foo
{
public:
    // Без ключевого слова explicit разрешаем конструктору вызываться неявно
    // для преобразования из int в Foo (по сути для создания временного
    // объекта)
    Foo(int foo = 0):
    m_foo(foo)
    {
    }
 
    int get_foo() const
    {
        return m_foo;
    }
 
    friend Foo operator+(const Foo &, const Foo &);
 
private:
    int m_foo;
};
 
Foo operator+(const Foo &left, const Foo &right)
{
    return Foo (left.m_foo + right.m_foo);
}
 
int main()
{
    Foo f1(2);
    Foo f2 = 5; // Здесь целое 5 преобразуется во временный объект Foo (5)
    Foo f3;
 
    f3 = f1 + f2; // Эквивалентно operator+(f1, f2);
    f3 = f3 + 2;  // Эквивалентно operator+(f3, Foo (2));
    f3 = 2 + f3;  // Эквивалентно operator+(Foo (2), f3);
 
    std::cout << f3.get_foo() << std::endl;
 
    return 0;
}
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 21:08     Переопределение оператора в классе #10
silent_1991, так речь же вроде о строках шла.
silent_1991
Эксперт С++
4961 / 3037 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 21:30     Переопределение оператора в классе #11
lazybiz, а чем строки принципиально в этом плане отличаться будут? Тут мы вместо Foo подсовываем int, который принимает конструктор, там вместо String подсунем char, который тоже будет принимать конструктор.

Добавлено через 20 минут
lazybiz, SatOleg, вот приблизительный пример со строками:
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
#include <iostream>
#include <cstring>
 
class String
{
public:
    String(const char *string):
    m_size(strlen(string)),
    m_string(new char [m_size])
    {
        strncpy(m_string, string, m_size);
    }
 
    String(char c):
    m_size(1),
    m_string(new char [m_size])
    {
        m_string[0] = c;
    }
 
    ~String()
    {
        delete [] m_string;
    }
 
    void print() const
    {
        for (size_t i = 0; i < m_size; ++i)
            std::cout << m_string[i];
    }
 
    friend String operator+(const String &, const String &);
 
    String &operator=(const String &right)
    {
        if (this != &right)
        {
            delete [] m_string;
 
            m_size = right.m_size;
 
            m_string = new char [m_size];
 
            strncpy(m_string, right.m_string, right.m_size);
        }
 
        return *this;
    }
 
private:
    size_t m_size;
    char *m_string;
};
 
String operator+(const String &left, const String &right)
{
    char *sum = new char [left.m_size + right.m_size + 1];
 
    strncpy(sum, left.m_string, left.m_size);
    strncpy(sum + left.m_size, right.m_string, right.m_size);
 
    sum[left.m_size + right.m_size] = '\0';
 
    return String (sum);
}
 
int main()
{
    String s1 = "abc";
    String s2 = "def";
    String s3 = s1 + s2;
 
    s3 = s3 + 'x';
    s3 = 'x' + s3;
 
    s3.print();
 
    return 0;
}
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 21:38     Переопределение оператора в классе #12
Цитата Сообщение от silent_1991 Посмотреть сообщение
lazybiz, а чем строки принципиально в этом плане отличаться будут?
Хотя бы тем что в С/С++ с переменной типа int можно сделать так: a += b, а с переменной типа char, и уж тем более со строкой ты такого не сделаешь не применяя посторонних классов. Я думаю строки принципиально в этом плане отличаться от не сток.
silent_1991
Эксперт С++
4961 / 3037 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 21:41     Переопределение оператора в классе #13
lazybiz, когда речь заходит о классах, все это отходит на второй план. Если вы в классе перегрузили оператор +, но не перегрузили +=, то вы сможете применять + к объектам класса, но на первый же += компилятор выдаст ошибку. Так что в данном случае разницы никакой, и вы можете убедиться в этом, посмотрев последний листинг в этой теме.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 21:57     Переопределение оператора в классе #14
silent_1991, я смотрю последний листинг и вот что я не вижу!, а я ничего не вижу... особенно перегрузку оператора += что собственно и должно являться корнем данной темы. Вы просто перенесли тему из одного контекста обсуждения в другой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2011, 22:05     Переопределение оператора в классе
Еще ссылки по теме:

Многоугольник. Переопределение оператора += - C++
Здравствуйте. Имеется класс Многоугольник. Преподаватель выдал доп.задания, одно из них переопределить += для добавления вершины (с...

Переопределение оператора <<, класса ofstream - C++
#ifndef COUT_RUS_H #define COUT_RUS_H #include &lt;iostream&gt; #include &lt;windows.h&gt; namespace rus { class Ccout { ...

Переопределение БИНАРНОГО оператора внутри класса - C++
Подскажите как правильно переопределить оператор + для сласса chislo. class chislo { int val; chislo chislo::operator +(const...

Переопределение оператора () для своего класса - C++
У меня вопрос. Как переопределить оператор () для своего класса?Если можно,приведите пример.

Для чего нужно переопределение оператора присваивания? - C++
HumansClass&amp; operator=(const HumansClass&amp; right); //переопределение операции присваивания Для чего нужно переопределение оператора...


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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт С++
4961 / 3037 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 22:05     Переопределение оператора в классе #15
lazybiz, прошу прощения, как в первый раз ошибочно прочитал в первом сообщении operator+, а не operator+=, так больше в него не заглядывал. Однако даже если это учесть, то каково будет отличие? Вот исправленный листинг, добавлен оператор +=. Что-то изменилось?

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
#include <iostream>
#include <cstring>
 
class String
{
public:
    String(const char *string):
    m_size(strlen(string)),
    m_string(new char [m_size])
    {
        strncpy(m_string, string, m_size);
    }
 
    String(char c):
    m_size(1),
    m_string(new char [m_size])
    {
        m_string[0] = c;
    }
 
    ~String()
    {
        delete [] m_string;
    }
 
    void print() const
    {
        for (size_t i = 0; i < m_size; ++i)
            std::cout << m_string[i];
    }
 
    friend String operator+(const String &, const String &);
 
    String &operator+=(const String &right)
    {
        String tmp = *this + right;
 
        *this = tmp;
 
        return *this;
    }
 
    String &operator=(const String &right)
    {
        if (this != &right)
        {
            delete [] m_string;
 
            m_size = right.m_size;
 
            m_string = new char [m_size];
 
            strncpy(m_string, right.m_string, right.m_size);
        }
 
        return *this;
    }
 
private:
    size_t m_size;
    char *m_string;
};
 
String operator+(const String &left, const String &right)
{
    char *sum = new char [left.m_size + right.m_size + 1];
 
    strncpy(sum, left.m_string, left.m_size);
    strncpy(sum + left.m_size, right.m_string, right.m_size);
 
    sum[left.m_size + right.m_size] = '\0';
 
    return String (sum);
}
 
int main()
{
    String s1 = "abc";
    String s2 = "def";
    String s3 = s1 + s2;
 
    //s3 = s3 + 'x';
    //s3 = 'x' + s3;
    s3 += 'x';
 
    s3.print();
 
    return 0;
}
Yandex
Объявления
11.08.2011, 22:05     Переопределение оператора в классе
Ответ Создать тему
Опции темы

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