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

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

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

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

11.08.2011, 19:11. Просмотров 2250. Ответов 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++
C++ Переопределение оператора присваивания
У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B? C++
C++ Переопределение оператора
Переопределение БИНАРНОГО оператора внутри класса C++
Переопределение оператора <<, класса ofstream C++
Для чего нужно переопределение оператора присваивания? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4879 / 3015 / 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
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 19:43     Переопределение оператора в классе #3
Можно в классе написать конструктор, принимающий char, и тогда вообще ничего дописывать не надо - будет произведено автоматическое преобразование типа и подойдёт уже написанный оператор для двух String'ов.

Добавлено через 50 секунд
lazybiz, а выход за массив не рассматриваем?))
castaway
Эксперт С++
4879 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 19:46     Переопределение оператора в классе #4
Цитата Сообщение от silent_1991 Посмотреть сообщение
lazybiz, а выход за массив не рассматриваем?))
Нет. Исходя из того что автор поста в описании первого оператора его не рассматривает я написал по-аналогии
Я лишь ответил на его вопрос, а нужна ли ему проверка или нет меня меньше всего волнует) Если хочешь то можешь у него об этом спросить) Таково мое мнение
silent_1991
Эксперт С++
4956 / 3032 / 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
Эксперт С++
4879 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 20:18     Переопределение оператора в классе #8
silent_1991, Давай мы не будем вступать в глубоко-интеллектуальные дискуссии. Какой был вопрос - такой и ответ. (точка большая и жирная)

Добавлено через 8 минут
Цитата Сообщение от silent_1991 Посмотреть сообщение
Можно в классе написать конструктор, принимающий char, и тогда вообще ничего дописывать не надо - будет произведено автоматическое преобразование типа и подойдёт уже написанный оператор для двух String'ов.
Кстати поподробней. Не совсем понял что ты имеешь в виду.
silent_1991
Эксперт С++
4956 / 3032 / 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
Эксперт С++
4879 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 21:08     Переопределение оператора в классе #10
silent_1991, так речь же вроде о строках шла.
silent_1991
Эксперт С++
4956 / 3032 / 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
Эксперт С++
4879 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 21:38     Переопределение оператора в классе #12
Цитата Сообщение от silent_1991 Посмотреть сообщение
lazybiz, а чем строки принципиально в этом плане отличаться будут?
Хотя бы тем что в С/С++ с переменной типа int можно сделать так: a += b, а с переменной типа char, и уж тем более со строкой ты такого не сделаешь не применяя посторонних классов. Я думаю строки принципиально в этом плане отличаться от не сток.
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 21:41     Переопределение оператора в классе #13
lazybiz, когда речь заходит о классах, все это отходит на второй план. Если вы в классе перегрузили оператор +, но не перегрузили +=, то вы сможете применять + к объектам класса, но на первый же += компилятор выдаст ошибку. Так что в данном случае разницы никакой, и вы можете убедиться в этом, посмотрев последний листинг в этой теме.
castaway
Эксперт С++
4879 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 21:57     Переопределение оператора в классе #14
silent_1991, я смотрю последний листинг и вот что я не вижу!, а я ничего не вижу... особенно перегрузку оператора += что собственно и должно являться корнем данной темы. Вы просто перенесли тему из одного контекста обсуждения в другой.
silent_1991
Эксперт С++
4956 / 3032 / 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;
}
castaway
Эксперт С++
4879 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 22:31     Переопределение оператора в классе #16
Цитата Сообщение от silent_1991 Посмотреть сообщение
Можно в классе написать конструктор, принимающий char ...
Это как бы твои слова.
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 22:35     Переопределение оператора в классе #17
lazybiz, ага, а выше как-бы мой код, в котором как-бы есть конструктор, принимающий как-бы char.
castaway
Эксперт С++
4879 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 23:30     Переопределение оператора в классе #18
Цитата Сообщение от silent_1991 Посмотреть сообщение
lazybiz, ага, а выше как-бы мой код, в котором как-бы есть конструктор, принимающий как-бы char.
Что самое удивительное, этого конструктора там нет. И давай ты больше меня не будешь убеждать в нереальности своих фактов! Это не серьезно!

Вот твой последний код:
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;
}
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 23:36     Переопределение оператора в классе #19
Цитата Сообщение от lazybiz Посмотреть сообщение
Я не вижу чтобы какой-то конструктор принимал тип char
Плохо смотрите. Я бы мог сразу назвать строчку, но давайте вы ещё разок повнимательнее присмотритесь. Можете даже создать в main'е объект класса String, передав ему в качестве параметра символ, пробежаться по коду дебаггером и посмотреть, на какую строку перескочит курсор при создании этого объекта. А можете просто открыть хоть один глаз (потому что, судя по всему, они оба у вас сейчас закрыты) и просмотреть каждый конструктор в классе (их там, конечно, до фига, целых два, и они дико разбросаны по коду, но вы уж постарайтесь).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2011, 23:57     Переопределение оператора в классе
Еще ссылки по теме:

Многоугольник. Переопределение оператора += C++
C++ Переопределение оператора ввода
C++ Переопределение оператора () для своего класса
Переопределение оператора ++ C++
Переопределение оператора == C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4879 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 23:57     Переопределение оператора в классе #20
Ты подразумеваешь под символом свой класс, автор темы хотел перегрузку оператора с char, если его устроит твой вариант то я за тебя рад..

Добавлено через 1 минуту
..хотя нет. не рад. Дорога к обеду ложка! и именно ложка! а не половник!!
Yandex
Объявления
11.08.2011, 23:57     Переопределение оператора в классе
Ответ Создать тему
Опции темы

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