Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
1

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

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

Author24 — интернет-сервис помощи студентам
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 += '?';
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.08.2011, 19:11
Ответы с готовыми решениями:

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

Переопределение оператора
Переопределил оператор "", как скрыть функцию "operator" так, чтобы она не была доступна при...

Переопределение оператора [][]
Всем привет. Есть проблема с заданием из курса по С++: В этой задаче вам требуется реализовать...

Переопределение оператора ++
Необходимо переопределить оператор ++ в классе IteratorBase так, чтобы при этом вызывалась функция...

33
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
11.08.2011, 19:39 2
Я думаю что в твоем случае это будет выглядеть так:
C++
1
2
3
n = strlen( mData );
mData[n] = ch;
mData[n + 1] = '\0';
* кстати это переопределение называется перегрузкой оператора.
1
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
11.08.2011, 19:43 3
Можно в классе написать конструктор, принимающий char, и тогда вообще ничего дописывать не надо - будет произведено автоматическое преобразование типа и подойдёт уже написанный оператор для двух String'ов.

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

Добавлено через 50 секунд
lazybiz, а выход за массив не рассматриваем?))
Да и правда так можно. Не подскажете как такой конструктор соорудить?
0
Заблокирован
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, в которую передавать размер копируемой строки, который не превосходит размер исходного буфера, выделенного внутри вашего класса.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
11.08.2011, 20:18 8
silent_1991, Давай мы не будем вступать в глубоко-интеллектуальные дискуссии. Какой был вопрос - такой и ответ. (точка большая и жирная)

Добавлено через 8 минут
Цитата Сообщение от silent_1991 Посмотреть сообщение
Можно в классе написать конструктор, принимающий char, и тогда вообще ничего дописывать не надо - будет произведено автоматическое преобразование типа и подойдёт уже написанный оператор для двух String'ов.
Кстати поподробней. Не совсем понял что ты имеешь в виду.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
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;
}
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
11.08.2011, 21:08 10
silent_1991, так речь же вроде о строках шла.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
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;
}
2
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
11.08.2011, 21:38 12
Цитата Сообщение от silent_1991 Посмотреть сообщение
lazybiz, а чем строки принципиально в этом плане отличаться будут?
Хотя бы тем что в С/С++ с переменной типа int можно сделать так: a += b, а с переменной типа char, и уж тем более со строкой ты такого не сделаешь не применяя посторонних классов. Я думаю строки принципиально в этом плане отличаться от не сток.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
11.08.2011, 21:41 13
lazybiz, когда речь заходит о классах, все это отходит на второй план. Если вы в классе перегрузили оператор +, но не перегрузили +=, то вы сможете применять + к объектам класса, но на первый же += компилятор выдаст ошибку. Так что в данном случае разницы никакой, и вы можете убедиться в этом, посмотрев последний листинг в этой теме.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
11.08.2011, 21:57 14
silent_1991, я смотрю последний листинг и вот что я не вижу!, а я ничего не вижу... особенно перегрузку оператора += что собственно и должно являться корнем данной темы. Вы просто перенесли тему из одного контекста обсуждения в другой.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
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;
}
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
11.08.2011, 22:31 16
Цитата Сообщение от silent_1991 Посмотреть сообщение
Можно в классе написать конструктор, принимающий char ...
Это как бы твои слова.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
11.08.2011, 22:35 17
lazybiz, ага, а выше как-бы мой код, в котором как-бы есть конструктор, принимающий как-бы char.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
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;
}
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
11.08.2011, 23:36 19
Цитата Сообщение от lazybiz Посмотреть сообщение
Я не вижу чтобы какой-то конструктор принимал тип char
Плохо смотрите. Я бы мог сразу назвать строчку, но давайте вы ещё разок повнимательнее присмотритесь. Можете даже создать в main'е объект класса String, передав ему в качестве параметра символ, пробежаться по коду дебаггером и посмотреть, на какую строку перескочит курсор при создании этого объекта. А можете просто открыть хоть один глаз (потому что, судя по всему, они оба у вас сейчас закрыты) и просмотреть каждый конструктор в классе (их там, конечно, до фига, целых два, и они дико разбросаны по коду, но вы уж постарайтесь).
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
11.08.2011, 23:57 20
Ты подразумеваешь под символом свой класс, автор темы хотел перегрузку оператора с char, если его устроит твой вариант то я за тебя рад..

Добавлено через 1 минуту
..хотя нет. не рад. Дорога к обеду ложка! и именно ложка! а не половник!!
0
11.08.2011, 23:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2011, 23:57
Помогаю со студенческими работами здесь

Переопределение оператора
У меня есть класс вектора. Надо переопределить оператор умножения числа на вектор. class myvector...

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

Переопределение оператора больше
Народ переопределял для сравнения знак больше но возникли траблы, выдается ошибочное значение, вот...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru