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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Miwa123
37 / 37 / 1
Регистрация: 16.04.2013
Сообщений: 317
Записей в блоге: 1
18.08.2013, 15:50     перегрузка == для класса string #1
можно ли для существующего класса string перегрузить оператор не вмешиваясь в библиотеку?
ни разу не сталкивался. Error: стринг не ялвется однозначным!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
18.08.2013, 16:31     перегрузка == для класса string #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;
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
18.08.2013, 16:34     перегрузка == для класса string #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 Посмотреть сообщение
ялвется

zenw
154 / 110 / 3
Регистрация: 12.06.2013
Сообщений: 168
18.08.2013, 16:39     перегрузка == для класса string #4
castaway, имхо, наследоваться от стандартных типов, в том числе std::string - не очень хорошая идея, они все-таки для этого не предназначены.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
18.08.2013, 16:41     перегрузка == для класса string #5
Цитата Сообщение от zenw Посмотреть сообщение
castaway, имхо, наследоваться от стандартных типов, в том числе std::string - не очень хорошая идея, они все-таки для этого не предназначены.
Откуда такая инфа?
Почему наследование - это плохая идея? Какая разница какой тип, стандартный или нет?
zenw
154 / 110 / 3
Регистрация: 12.06.2013
Сообщений: 168
18.08.2013, 16:44     перегрузка == для класса string #6
Цитата Сообщение от castaway Посмотреть сообщение
Почему наследование - это плохая идея? Какая разница какой тип, стандартный или нет?
Хотя бы потому, что у std::string нет виртуального деструктора, а удаление объекта, унаследованного от класса без виртуального деструктора через указатель - undefined behaviour.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
18.08.2013, 16:53     перегрузка == для класса string #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;
}
Как ты думаешь, какой деструктор будет вызван?
Убежденный
Системный программист
 Аватар для Убежденный
14216 / 6231 / 988
Регистрация: 02.05.2013
Сообщений: 10,390
Завершенные тесты: 1
18.08.2013, 16:55     перегрузка == для класса string #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, чешем затылок и
думаем, а оно нам надо ?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
18.08.2013, 16:56     перегрузка == для класса string #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
правда не все так просто, как кажется на первый взгляд (например операторы << и >> теперь работать не будут), но зато (имхо) более красиво.
zenw
154 / 110 / 3
Регистрация: 12.06.2013
Сообщений: 168
18.08.2013, 16:56     перегрузка == для класса string #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;
}
А вы?
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
18.08.2013, 17:01     перегрузка == для класса string #11
Цитата Сообщение от zenw Посмотреть сообщение
А вы?
Что и следовало ожидать. Твой пример - это осознание своей ошибки и перевод темы в другое "русло".
C++
1
2
3
4
    ...
    B *obj = new B;
    delete obj;
    ...
zenw
154 / 110 / 3
Регистрация: 12.06.2013
Сообщений: 168
18.08.2013, 17:08     перегрузка == для класса string #12
Какой ошибки? Я же еще в первом посте написал:
удаление объекта, унаследованного от класса без виртуального деструктора через указатель - undefined behaviour.
Вы же сначала мне суете пример с удалением объекта на стеке, а потом обвиняете в переводе темы "в другое русло". Почитайте Саттера, что ли, http://programming-lang.com/ru/comp_...ter/0/j85.html
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
18.08.2013, 17:19     перегрузка == для класса string #13
При чем тут указатель? Обрати внимание на эту конструкцию: B *obj = new B; и скажи мне чем это чревато? Или ты до сих пор уверен что деструкторы классов A и B не будут вызваны?
zenw
154 / 110 / 3
Регистрация: 12.06.2013
Сообщений: 168
18.08.2013, 17:20     перегрузка == для класса string #14
B * - ничем, A * - чревато, чем - я показал. Если вы гарантируете, что все объекты будут удаляться через указатель типа B *, а объекты класса С - через указатель С *, и так далее (про умные указатели вообще промолчу) - милости прошу. Вот только мне кажется, что гарантировать этого нельзя (иначе зачем вообще нужно наследование), и рано или поздно при наследовании от класса без виртуального деструктора столкнетесь с не очень ожидаемым поведением, когда деструкторы унаследованных классов будут не вызываться.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
18.08.2013, 17:22     перегрузка == для класса string #15
Цитата Сообщение от zenw Посмотреть сообщение
чем - я показал.
Все это прекрасно знают, поверьте!
Вы действительно перевели наследование класса в ошибки полиморфного использования - это уже другое русло.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
18.08.2013, 17:25     перегрузка == для класса string #16
zenw, в коде из 2-го поста будет вызван деструктор класса std::string. Что и требовалось доказать.
zenw
154 / 110 / 3
Регистрация: 12.06.2013
Сообщений: 168
18.08.2013, 17:27     перегрузка == для класса string #17
Цитата Сообщение от castaway Посмотреть сообщение
zenw, в коде из 2-го поста будет вызван деструктор класса std::string. Что и требовалось доказать.
Собственно, я с этим и не спорил)
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.08.2013, 21:19     перегрузка == для класса string #18
Цитата Сообщение от Miwa123 Посмотреть сообщение
можно ли для существующего класса string перегрузить оператор не вмешиваясь в библиотеку?
зачем?

Цитата Сообщение от Miwa123 Посмотреть сообщение
ни разу не сталкивался. Error: стринг не ялвется однозначным!
почему? где код?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
18.08.2013, 21:26     перегрузка == для класса string #19
Цитата Сообщение от Jupiter Посмотреть сообщение
почему?
похоже у ТС'а в коде было using namespace std;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2013, 12:06     перегрузка == для класса string
Еще ссылки по теме:

Перегрузка операции < для класса вектор C++
C++ Перегрузка преобразования класса-строка в тип string (и наоборот)
C++ Перегрузка оператора >> для пользовательского класса String

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

Или воспользуйтесь поиском по форуму:
Miwa123
37 / 37 / 1
Регистрация: 16.04.2013
Сообщений: 317
Записей в блоге: 1
19.08.2013, 12:06  [ТС]     перегрузка == для класса string #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()
{
 
}
при такой конструкции, компилятор будет список аргументов контролировать и действовать только при сложнении стринг?
Yandex
Объявления
19.08.2013, 12:06     перегрузка == для класса string
Ответ Создать тему
Опции темы

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