Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

11.08.2011, 19:11. Просмотров 2391. Ответов 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 += '?';
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2011, 19:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Переопределение оператора в классе (C++):

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

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

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

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

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

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

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

Добавлено через 50 секунд
lazybiz, а выход за массив не рассматриваем?))
1
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 19:46 #4
Цитата Сообщение от silent_1991 Посмотреть сообщение
lazybiz, а выход за массив не рассматриваем?))
Нет. Исходя из того что автор поста в описании первого оператора его не рассматривает я написал по-аналогии
Я лишь ответил на его вопрос, а нужна ли ему проверка или нет меня меньше всего волнует) Если хочешь то можешь у него об этом спросить) Таково мое мнение
1
silent_1991
Эксперт С++
5006 / 3064 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
11.08.2011, 20:00 #5
lazybiz, да мне тоже не особо интересно, но если уж взялся помогать, то хотя бы на словах поясню, какие могут быть проблемы и как примерно их решать. Таково моё мнение.
1
SatOleg
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
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 20:18 #8
silent_1991, Давай мы не будем вступать в глубоко-интеллектуальные дискуссии. Какой был вопрос - такой и ответ. (точка большая и жирная)

Добавлено через 8 минут
Цитата Сообщение от silent_1991 Посмотреть сообщение
Можно в классе написать конструктор, принимающий char, и тогда вообще ничего дописывать не надо - будет произведено автоматическое преобразование типа и подойдёт уже написанный оператор для двух String'ов.
Кстати поподробней. Не совсем понял что ты имеешь в виду.
0
silent_1991
Эксперт С++
5006 / 3064 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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;
}
0
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 21:08 #10
silent_1991, так речь же вроде о строках шла.
0
silent_1991
Эксперт С++
5006 / 3064 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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;
}
2
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 21:38 #12
Цитата Сообщение от silent_1991 Посмотреть сообщение
lazybiz, а чем строки принципиально в этом плане отличаться будут?
Хотя бы тем что в С/С++ с переменной типа int можно сделать так: a += b, а с переменной типа char, и уж тем более со строкой ты такого не сделаешь не применяя посторонних классов. Я думаю строки принципиально в этом плане отличаться от не сток.
0
silent_1991
Эксперт С++
5006 / 3064 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
11.08.2011, 21:41 #13
lazybiz, когда речь заходит о классах, все это отходит на второй план. Если вы в классе перегрузили оператор +, но не перегрузили +=, то вы сможете применять + к объектам класса, но на первый же += компилятор выдаст ошибку. Так что в данном случае разницы никакой, и вы можете убедиться в этом, посмотрев последний листинг в этой теме.
0
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 21:57 #14
silent_1991, я смотрю последний листинг и вот что я не вижу!, а я ничего не вижу... особенно перегрузку оператора += что собственно и должно являться корнем данной темы. Вы просто перенесли тему из одного контекста обсуждения в другой.
0
silent_1991
Эксперт С++
5006 / 3064 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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;
}
0
11.08.2011, 22:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2011, 22:05
Привет! Вот еще темы с ответами:

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

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

У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B? - C++
#include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; //Вот главный класс class A{ public: A (){}; class...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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