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

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

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

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

11.08.2011, 19:11. Просмотров 2279. Ответов 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++
Здравствуйте. Такая проблема: для поиска требуется сравнить два числа(в 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...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 22:31 #16
Цитата Сообщение от silent_1991 Посмотреть сообщение
Можно в классе написать конструктор, принимающий char ...
Это как бы твои слова.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 22:35 #17
lazybiz, ага, а выше как-бы мой код, в котором как-бы есть конструктор, принимающий как-бы char.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.08.2011, 23:36 #19
Цитата Сообщение от lazybiz Посмотреть сообщение
Я не вижу чтобы какой-то конструктор принимал тип char
Плохо смотрите. Я бы мог сразу назвать строчку, но давайте вы ещё разок повнимательнее присмотритесь. Можете даже создать в main'е объект класса String, передав ему в качестве параметра символ, пробежаться по коду дебаггером и посмотреть, на какую строку перескочит курсор при создании этого объекта. А можете просто открыть хоть один глаз (потому что, судя по всему, они оба у вас сейчас закрыты) и просмотреть каждый конструктор в классе (их там, конечно, до фига, целых два, и они дико разбросаны по коду, но вы уж постарайтесь).
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.08.2011, 23:57 #20
Ты подразумеваешь под символом свой класс, автор темы хотел перегрузку оператора с char, если его устроит твой вариант то я за тебя рад..

Добавлено через 1 минуту
..хотя нет. не рад. Дорога к обеду ложка! и именно ложка! а не половник!!
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
12.08.2011, 00:39 #24
Так, ребят, я гляжу вы друг-друга поддерживаете, и я не первый раз это замечаю.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
12.08.2011, 00:50 #25
ты уже написал, а так же то что не умеешь отвечать за то что написал
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
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
а память кто страуструп выделять будет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2011, 13:11
Привет! Вот еще темы с ответами:

Переопределение оператора инкремента - 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 { ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.08.2011, 13:11
Ответ Создать тему
Опции темы

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