Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Возможен ли класс строк, чтобы писать if(a+b==c)


Автор: Ibragim 9.7.2008, 09:53
Всем день добрый. По поиску нашел похожие темы, но не совсем то что хотелось бы (http://forum.vingrad.ru/topic-215258.html, http://forum.vingrad.ru/topic-113518.html, http://forum.vingrad.ru/topic-122332.html), поэтому вынесу вопрос на оборзе^w обозрение.

Итого задача. Чисто теоретическая, возможно ли такое в принципе.
Необходимо создать такой класс работы со строками, чтобы с объектами класса можно было проводить подобные операции:

Код

mystring a,b,c;
if(a == b + c) ....


Перегрузка операторов сравнения и сложения - все понятно, но получается ТЕОРЕТИЧЕСКОЕ ограничение:
Оператор + должен возвращать объект (или ссылку на объект, не важно), а поскольку b и с - строки - то получается что придется выделять память и создавать такой объект. Понятно, что это никуда не годится - ведь память останется не освобожденной для такого созданного объекта (a+b).

Вот и вопрос - есть ли возможность корректно создать класс работы со строками, с объектами которого без дополнительных ухищрений можно будет проводить подобные операции? 
Я не вижу никакого варианта решения, так сказать, ввиду структуры языка, но я много чего не знаю, вот и спрашиваю.

PS А, приложение имеет достаточно жесткие ограничения по размеру / кроссплатформенности / подключаемым библиотекам, то есть вопрос о том, как реализовать самому, а не в какой библиотеке есть что-то похоже.

Автор: Alek86 9.7.2008, 10:01
Цитата(Ibragim @  9.7.2008,  09:53 Найти цитируемый пост)
Необходимо создать такой класс работы со строками, чтобы с объектами класса можно было проводить подобные операции:

не парься, уже до тебя все придумано
Код

#include <string>
int main() {
 std::string a,b,c;
 if(a == b + c) {}
}


Цитата(Ibragim @  9.7.2008,  09:53 Найти цитируемый пост)
Оператор + должен возвращать объект (или ссылку на объект, не важно), а поскольку b и с - строки - то получается что придется выделять память и создавать такой объект. Понятно, что это никуда не годится - ведь память останется не освобожденной для такого созданного объекта (a+b).

не правильно
поскольку оператор + возвращает объект по значению, то он является стековым и удалится при достижении конца своего скопа

Добавлено через 4 минуты и 55 секунд
Цитата(Ibragim @  9.7.2008,  09:53 Найти цитируемый пост)
Вот и вопрос - есть ли возможность корректно создать класс работы со строками, с объектами которого без дополнительных ухищрений можно будет проводить подобные операции? 


Код

#include <iostream>

struct S {
 S() : i(0) { std::cout << "Constructor" << std::endl; }
 S(const S& s) : i(s.i) { std::cout << "Copy Constructor" << std::endl; }
 ~S() { std::cout << "Destructor" << std::endl; }
 int i;
};
S operator +(const S& s1, const S& s2) {
 S temp;
 temp.i = s1.i + s2.i;
 return temp;
}

судя по выводу, все нормально smile

Автор: Ibragim 9.7.2008, 10:07
Код

#include <string>
int main() {
 std::string a,b,c;
 if(a == b + c) {}
}


Да, спасибо, под std вариант мне знаком. Но хотелось бы узнать, реализуема ли проблема теоретически - ну например не для строк, а для других объектов, членами которых есть динамически выделяемые куски памяти.

не правильно
поскольку оператор + возвращает объект по значению, то он является стековым и удалится при достижении конца своего скопа


м... да? а то что при сложении двух строк при реализации оператора сложения мне придется делать malloc()/new() тоже ничего? вроде не должен компилятор настолько умным быть smile 

Автор: Alek86 9.7.2008, 10:08
Цитата(Ibragim @  9.7.2008,  09:53 Найти цитируемый пост)
PS А, приложение имеет достаточно жесткие ограничения по размеру / кроссплатформенности / подключаемым библиотекам, то есть вопрос о том, как реализовать самому, а не в какой библиотеке есть что-то похоже.

если твой компилятор стандартен, то он обязан иметь возможность подключить string
и я не уверен, что тебе самому получится сделать что-то более быстрое/удобное/кроссплатформенное/мелкое, чем std::string

Добавлено @ 10:10
Цитата(Ibragim @  9.7.2008,  10:07 Найти цитируемый пост)
а то что при сложении двух строк при реализации оператора сложения мне придется делать malloc()/new() тоже ничего? вроде не должен компилятор настолько умным быть

не, компилятор не должен
но есть такая штука, как умные указатели
std::auto_ptr, boost::shared_ptr...
храни результат выделения памяти в них, и они в деструкторе удалят твой new (malloc в плюсах крайне нехорошо использовать)

Автор: Ibragim 9.7.2008, 10:16
Понятно, то есть настоятельные рекомендации использовать std:: 
Ну что ж, спасибо, в любом случае практическую сторону вопроса так и будем решать. Если кто-то позже прочтет эту тему и знает как решить данный вопрос без std, очень прошу написать для общего развития.
А пока спасибо Alek86, пометим как решенный.

Автор: Alek86 9.7.2008, 10:23
Цитата(Ibragim @  9.7.2008,  10:16 Найти цитируемый пост)
Если кто-то позже прочтет эту тему и знает как решить данный вопрос без std, очень прошу написать для общего развития.

и чем ему auto_ptr не понравился?...

Автор: Daevaorn 9.7.2008, 10:44
Цитата(Ibragim @  9.7.2008,  11:16 Найти цитируемый пост)
Если кто-то позже прочтет эту тему и знает как решить данный вопрос без std, очень прошу написать для общего развития.

И еще без использования компилятора С++ и компьютера, так, для общего развития;)

Автор: xvr 9.7.2008, 11:26
Цитата(Ibragim @ 9.7.2008,  10:16)
Понятно, то есть настоятельные рекомендации использовать std:: 
Ну что ж, спасибо, в любом случае практическую сторону вопроса так и будем решать. Если кто-то позже прочтет эту тему и знает как решить данный вопрос без std, очень прошу написать для общего развития.
А пока спасибо Alek86, пометим как решенный.

Открою тебе великую тайну  smile - std::string не есть нечто, глубоко похоронненое в компиляторе, это всего лишь один из стандартных классов. И его полный текст (о сюрприз!) лежит в файле string в директории со стандартными инклюдами. Вдумчивые медитации над его содержимым помогут достичь просветления и постигнуть сокровенные методики использования классов, возвращаемых по значению (а так же еще много всякой другой мелочи, типа операторов new[] и delete[] и пр)

Автор: SteN 9.7.2008, 15:14
а что мешает в opertaor + создать объект? Память соответсвенно чистится в диструкторе...
Код

class STR
{
    char *data;
    int sz;
public:
    STR():data(NULL),sz(0){printf("C %d\n",sz);};
    STR(STR &s);
    STR(int i);
    ~STR(){delete data;printf("D %d\n",sz);};

    STR operator + (STR &s)
    {
        STR res(sz+s.sz);
        //...
        return res;
    };

    bool operator == (STR &s)
    {
        printf("==\n");
        return (sz==s.sz);
    }


};
STR::STR(STR &s)
{
    sz=s.sz;
    data = new char [sz];
    memcpy(data,s.data,sz*sizeof(char));
    printf("C+%d\n",sz);
}

STR::STR(int i)
{
    sz=i;
    data = new char [sz];
    memset(data,0,sz*sizeof(char));
    printf("Ci%d\n",sz);
}

void main ()
{
    STR a(5),b(10);

    STR c;
    bool res = (c == a+b);
}


ПС: код ужасен, знаю. Но суть,я думаю,передал.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)