Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
38 / 38 / 22
Регистрация: 16.04.2013
Сообщений: 327
Записей в блоге: 1
1

перегрузка == для класса string

18.08.2013, 15:50. Показов 3248. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
можно ли для существующего класса string перегрузить оператор не вмешиваясь в библиотеку?
ни разу не сталкивался. Error: стринг не ялвется однозначным!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.08.2013, 15:50
Ответы с готовыми решениями:

Перегрузка оператора + для класса String
Подскажите, как реализовать перегрузку оператора сложения для класса String Вот, что пока...

Перегрузка оператора >> для пользовательского класса String
Объявление класса: class String { public: //constructor String( const char * = NULL...

Перегрузка потокового ввода/вывода для класса с полем типа string
Возможно ли перегрузить >> и << или придётся заменить переменную string на массив char? У меня...

Перегрузка операторов класса String
Помогите сделать: Создать класс строка Stroka. Перегрузить операторы: 1) ! как унарный метод...

20
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
18.08.2013, 16:31 2
Цитата Сообщение от Miwa123 Посмотреть сообщение
можно ли для существующего класса string перегрузить оператор не вмешиваясь в библиотеку?
Можно создать порожденный класс с перегруженным оператором.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>
 
struct my_string : public std::string {
    my_string( const char *s ) : std::string( s ) {}
 
    bool operator == ( const std::string & a ) {
        return (std::string)(*this) == a;
    }
};
 
int main()
{
    my_string a( "abc" );
    my_string b( "abc" );
    std::cout << (a == b ? "true" : "false") << std::endl;
}
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
18.08.2013, 16:34 3
Цитата Сообщение от Miwa123 Посмотреть сообщение
Error: стринг не ялвется однозначным!
:/
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
 
bool operator ==(std::string const& lhs, std::string const& rhs) {
   return std::operator ==(lhs, rhs);
}
 
int main() {
   std::string lhs("lhs"), rhs("rhs");
   std::cout << std::boolalpha << (lhs == rhs) << std::endl;
}
http://ideone.com/XRVcm4

Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от Miwa123 Посмотреть сообщение
ялвется
%-)

2
154 / 110 / 9
Регистрация: 12.06.2013
Сообщений: 168
18.08.2013, 16:39 4
castaway, имхо, наследоваться от стандартных типов, в том числе std::string - не очень хорошая идея, они все-таки для этого не предназначены.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
18.08.2013, 16:41 5
Цитата Сообщение от zenw Посмотреть сообщение
castaway, имхо, наследоваться от стандартных типов, в том числе std::string - не очень хорошая идея, они все-таки для этого не предназначены.
Откуда такая инфа?
Почему наследование - это плохая идея? Какая разница какой тип, стандартный или нет?
0
154 / 110 / 9
Регистрация: 12.06.2013
Сообщений: 168
18.08.2013, 16:44 6
Цитата Сообщение от castaway Посмотреть сообщение
Почему наследование - это плохая идея? Какая разница какой тип, стандартный или нет?
Хотя бы потому, что у std::string нет виртуального деструктора, а удаление объекта, унаследованного от класса без виртуального деструктора через указатель - undefined behaviour.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
18.08.2013, 16:53 7
Цитата Сообщение от zenw Посмотреть сообщение
Хотя бы потому, что у std::string нет виртуального деструктора, а удаление объекта, унаследованного от класса без виртуального деструктора через указатель - undefined behaviour.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
class A {
public:
    A() {
        std::cout << "A::A()\n";
    }
 
    ~A() {
        std::cout << "A::~A()\n";
    }
};
 
struct B : public A {
    ~B() {
        std::cout << "B::~B()\n";
    }
};
 
int main()
{
    B b;
}
Как ты думаешь, какой деструктор будет вызван?
1
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
18.08.2013, 16:55 8
Цитата Сообщение от Miwa123 Посмотреть сообщение
можно ли для существующего класса string перегрузить оператор не вмешиваясь в библиотеку?
Можно:
C++
1
2
3
4
5
6
7
8
9
10
// comparer.h
 
#pragma once
 
#include <iostream>
 
bool operator ==(std::string const &Left, std::string const &Right)
{
    return (0 != (Left.compare(Right)));
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// main.cpp
 
#include <iostream>
#include <string>
 
#include "comparer.h"
 
int main()
{
    using namespace std;
 
    string a = "123";
    string b = "456";
 
    cout << boolalpha << (a == b) << endl;
 
    return 0;
}
Вывод:
>true
Теперь комментируем строку с #include "comparer.h", получаем false, чешем затылок и
думаем, а оно нам надо ?
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
18.08.2013, 16:56 9
Если нужно переопределить поведение std::string, то лучше как-нибудь так:
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
#include <iostream>
#include <string>
 
class char_traits : public std::char_traits<char>
{
public:
 
    static int compare(const char *left, const char *right, size_t length)
    {
        // тут сравниваем 2 строки
        std::cout << "HERE" << std::endl; 
 
        return 0;
    }
};
 
typedef std::basic_string<char, char_traits> string;
 
int main()
{
    string str1("one"), str2("two");    
    std::cout << std::boolalpha << (str1 == str2) << std::endl;
 
    return 0;
}
http://ideone.com/LJI0o8
правда не все так просто, как кажется на первый взгляд (например операторы << и >> теперь работать не будут), но зато (имхо) более красиво.
0
154 / 110 / 9
Регистрация: 12.06.2013
Сообщений: 168
18.08.2013, 16:56 10
Цитата Сообщение от castaway Посмотреть сообщение
Как ты думаешь, какой деструктор будет вызван?
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
#include <iostream>
 
class A {
public:
    A() {
        std::cout << "A::A()\n";
    }
 
    ~A() {
        std::cout << "A::~A()\n";
    }
};
 
struct B : public A {
    ~B() {
        std::cout << "B::~B()\n";
    }
};
 
int main()
{
    A *obj = new B();
    delete obj;
}
А вы?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
18.08.2013, 17:01 11
Цитата Сообщение от zenw Посмотреть сообщение
А вы?
Что и следовало ожидать. Твой пример - это осознание своей ошибки и перевод темы в другое "русло".
C++
1
2
3
4
    ...
    B *obj = new B;
    delete obj;
    ...
0
154 / 110 / 9
Регистрация: 12.06.2013
Сообщений: 168
18.08.2013, 17:08 12
Какой ошибки? Я же еще в первом посте написал:
удаление объекта, унаследованного от класса без виртуального деструктора через указатель - undefined behaviour.
Вы же сначала мне суете пример с удалением объекта на стеке, а потом обвиняете в переводе темы "в другое русло". Почитайте Саттера, что ли, http://programming-lang.com/ru... 0/j85.html
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
18.08.2013, 17:19 13
При чем тут указатель? Обрати внимание на эту конструкцию: B *obj = new B; и скажи мне чем это чревато? Или ты до сих пор уверен что деструкторы классов A и B не будут вызваны?
0
154 / 110 / 9
Регистрация: 12.06.2013
Сообщений: 168
18.08.2013, 17:20 14
B * - ничем, A * - чревато, чем - я показал. Если вы гарантируете, что все объекты будут удаляться через указатель типа B *, а объекты класса С - через указатель С *, и так далее (про умные указатели вообще промолчу) - милости прошу. Вот только мне кажется, что гарантировать этого нельзя (иначе зачем вообще нужно наследование), и рано или поздно при наследовании от класса без виртуального деструктора столкнетесь с не очень ожидаемым поведением, когда деструкторы унаследованных классов будут не вызываться.
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
18.08.2013, 17:22 15
Цитата Сообщение от zenw Посмотреть сообщение
чем - я показал.
Все это прекрасно знают, поверьте!
Вы действительно перевели наследование класса в ошибки полиморфного использования - это уже другое русло.
2
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
18.08.2013, 17:25 16
zenw, в коде из 2-го поста будет вызван деструктор класса std::string. Что и требовалось доказать.
1
154 / 110 / 9
Регистрация: 12.06.2013
Сообщений: 168
18.08.2013, 17:27 17
Цитата Сообщение от castaway Посмотреть сообщение
zenw, в коде из 2-го поста будет вызван деструктор класса std::string. Что и требовалось доказать.
Собственно, я с этим и не спорил)
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
18.08.2013, 21:19 18
Цитата Сообщение от Miwa123 Посмотреть сообщение
можно ли для существующего класса string перегрузить оператор не вмешиваясь в библиотеку?
зачем?

Цитата Сообщение от Miwa123 Посмотреть сообщение
ни разу не сталкивался. Error: стринг не ялвется однозначным!
почему? где код?
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
18.08.2013, 21:26 19
Цитата Сообщение от Jupiter Посмотреть сообщение
почему?
похоже у ТС'а в коде было using namespace std;
0
38 / 38 / 22
Регистрация: 16.04.2013
Сообщений: 327
Записей в блоге: 1
19.08.2013, 12:06  [ТС] 20
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
bool operator+(std::string const &Left, std::string const &Right)
{
 
}
    
int main()
{
 
}
при такой конструкции, компилятор будет список аргументов контролировать и действовать только при сложнении стринг?
0
19.08.2013, 12:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2013, 12:06
Помогаю со студенческими работами здесь

Перегрузка операторов класса String
Срочно нужна помощь. Реализовать класс String для работы со строками символов. Перегрузить...

Перегрузка преобразования класса-строка в тип string (и наоборот)
Помогите, а то не могу разобраться:(( перегрузка преобразования класса-строка в тип string (и...

Перегрузка оператора >> для дочернего класса от базового виртуального класса
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием должного времени на...

Перегрузка оператора == для string
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;fstream&gt; #include &lt;string&gt; #include &lt;stdlib.h&gt;...


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

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