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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
11.08.2011, 19:11     Переопределение оператора в классе #1
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 += '?';
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.08.2011, 00:04     Переопределение оператора в классе #21
lazybiz, я ничего ни под каким символом не подразумеваю. Я подразумеваю под моим классом сильно упрощённый вариант строки, один из конструкторов которой принимает тип char в качестве аргумента и делает из символа строку. И я с самого начала говорил об этом.
Вы вообще-то в 8 сообщении попросили пояснить, что я имел ввиду. Я пояснил. Я написал конструктор, принимающий char, и показал, что при этом не обязательно писать специальную перегрузку +=, принимающую char, а хватит и уже написанной, для String. А после этого вы начали троллить меня.
И за меня не надо радоваться, лучше радуйтесь за себя. Или не радуйтесь. Грустите. Мне, честно говоря, до лампочки.

Добавлено через 3 минуты
lazybiz, какой половник, что вы несёте? Вы попросили разъяснить, что я имел ввиду, так и родился этот код. Пойми вы то, что и так очевидно, сразу, без примеров, этого кода вообще бы не было, и сидели бы вы со своей ложкой дальше.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
12.08.2011, 00:27     Переопределение оператора в классе #22
Цитата Сообщение от lazybiz Посмотреть сообщение
Хотя бы тем что в С/С++ с переменной типа int можно сделать так: a += b, а с переменной типа char, и уж тем более со строкой ты такого не сделаешь не применяя посторонних классов. Я думаю строки принципиально в этом плане отличаться от не сток.
Ни тип int, ни тип char никакой роли не играют для оператора +=. Вам пытаются донести азы языка С++, что конструктор с одним параметром является определенной пользователем функцией преобразования типов. И поэтому если у вас есть опреатор += для объектов класса String, и есть конструктор с одним параметром, который принимает в качестве параметра либо int, либо Char, то писать отдельно оператор += для типов int или char нет смысла, так как компилятор вместо int и char подставит объект класса String, который он неявно вызовет для этих типов.
alex_x_x
12.08.2011, 00:34
  #23

Не по теме:

Цитата Сообщение от lazybiz Посмотреть сообщение
Хотя бы тем что в С/С++ с переменной типа int можно сделать так: a += b, а с переменной типа char, и уж тем более со строкой ты такого не сделаешь не применяя посторонних классов.
C++
1
2
3
4
5
6
7
  
int main()
{
  char a = 'b' - 'a';
  char b = '0';
  a += b;
}
что я делаю не так?
не говоря уже о том, что в си урожденная конвертация char<>int

castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
12.08.2011, 00:39     Переопределение оператора в классе #24
Так, ребят, я гляжу вы друг-друга поддерживаете, и я не первый раз это замечаю.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.08.2011, 00:50     Переопределение оператора в классе #25
ты уже написал, а так же то что не умеешь отвечать за то что написал
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
12.08.2011, 00:56     Переопределение оператора в классе #26
Цитата Сообщение от alex_x_x Посмотреть сообщение
ты уже написал, а так же то что не умеешь отвечать за то что написал
Если хочешь что-то спросить - то спроси! Не надо этой мутной грязи!
Не присоединяйся к ним. Будь выше!
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
12.08.2011, 11:57  [ТС]     Переопределение оператора в классе #27
Цитата Сообщение от silent_1991 Посмотреть сообщение
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;
}
Мне кажется все таки конструктор должен быть
C++
1
2
3
4
5
6
7
    String(char c):
    m_size(1),
    m_string(new char [m_size])
    {
        m_string[0] = c;
        m_string[1] = '\0';
    }
Добавлено через 56 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class String
{
 
  char *mData;
  static const int c_size = 100;
....
public:
friend istream & operator>> (istream &str, String &s);
...
}
 
istream & operator>> (istream &str, String &s)
{
   char* Data;
   str >> Data;
   s.mData = Data;
   return str;
}
Выпадает с кучей ошибок типа

20 `istream' is neither function nor member function; cannot be declared friend
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
12.08.2011, 12:11     Переопределение оператора в классе #28
SatOleg, а про то, что istream на самом деле std::istream не забыл?
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
12.08.2011, 13:09  [ТС]     Переопределение оператора в классе #29
Цитата Сообщение от grizlik78 Посмотреть сообщение
SatOleg, а про то, что istream на самом деле std::istream не забыл?
C++
1
2
 char* Data;
   str >> Data;
беда где то тут. при исполнении выпадает в ошибку сегментации
LosAngeles
Заблокирован
12.08.2011, 13:11     Переопределение оператора в классе #30
а память кто страуструп выделять будет?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.08.2011, 15:01     Переопределение оператора в классе #31
Цитата Сообщение от SatOleg Посмотреть сообщение
Мне кажется все таки конструктор должен быть
А мне кажется, нет. Ибо, как вы могли заметить, я оперирую не со стандартной си-строкой, а с массивом символов, для которого ограничение нулём не является обязательным.
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
12.08.2011, 15:12  [ТС]     Переопределение оператора в классе #32
Цитата Сообщение от LosAngeles Посмотреть сообщение
а память кто страуструп выделять будет?
а под что выделять то? мы читаем в поле уже созданной переменной. и под нее уже есть память

Добавлено через 1 минуту
Цитата Сообщение от silent_1991 Посмотреть сообщение
А мне кажется, нет. Ибо, как вы могли заметить, я оперирую не со стандартной си-строкой, а с массивом символов, для которого ограничение нулём не является обязательным.
если я вывожу строку в стандартный поток то видно что метод работает не очень верно =(
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.08.2011, 15:15     Переопределение оператора в классе #33
SatOleg, да ну. У нас создан указатель. А память под строку, на которую и должен в конечном итоге указывать указатель, не выделена, т.е. указатель не инициализирован и содержит мусор, т.е. указывает на случайную область памяти, т.е. потенциально мы можем затереть важные данные, переписывая эту область. Программа может упасть тут же, а может проработать ещё долго, и такую ошибку очень сложно будет обнаружить.

Добавлено через 1 минуту
SatOleg, это потому, что надо соответствующим образом перегрузить оператор сдвига)) Посмотрите, как реализован метод print у меня. Согласен, с 0 на конце удобнее в этом деле, но это дополнительный головняк, поскольку при каком нибудь выделении памяти можно забыть к размеру прибавить 1 и долго сношать мозг, ища, почему программа падает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2011, 15:22     Переопределение оператора в классе
Еще ссылки по теме:

переопределение оператора <<, класса ofstream C++
Многоугольник. Переопределение оператора += C++
C++ Переопределение оператора ввода

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

Или воспользуйтесь поиском по форуму:
SatOleg
0 / 0 / 0
Регистрация: 05.08.2011
Сообщений: 30
12.08.2011, 15:22  [ТС]     Переопределение оператора в классе #34
Полностью внял вашим мотивам. СПС =)
Yandex
Объявления
12.08.2011, 15:22     Переопределение оператора в классе
Ответ Создать тему
Опции темы

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