Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возможен ли класс строк, чтобы писать if(a+b==c), Выделение памяти, перегрузка операторов 
V
    Опции темы
Ibragim
Дата 9.7.2008, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



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

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

Код

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


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

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

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

Это сообщение отредактировал(а) Ibragim - 9.7.2008, 09:56
PM MAIL   Вверх
Alek86
Дата 9.7.2008, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(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


--------------------
user posted image    user posted image
PM MAIL   Вверх
Ibragim
Дата 9.7.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



Код

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


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

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


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

Это сообщение отредактировал(а) Ibragim - 9.7.2008, 10:09
PM MAIL   Вверх
Alek86
Дата 9.7.2008, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(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 в плюсах крайне нехорошо использовать)

Это сообщение отредактировал(а) Alek86 - 9.7.2008, 10:11


--------------------
user posted image    user posted image
PM MAIL   Вверх
Ibragim
Дата 9.7.2008, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) Ibragim - 9.7.2008, 10:17
PM MAIL   Вверх
Alek86
Дата 9.7.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



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

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


--------------------
user posted image    user posted image
PM MAIL   Вверх
Daevaorn
Дата 9.7.2008, 10:44 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



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

И еще без использования компилятора С++ и компьютера, так, для общего развития;)
PM MAIL WWW   Вверх
xvr
Дата 9.7.2008, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

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

PM MAIL   Вверх
SteN
Дата 9.7.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.9.2006
Где: Брянск

Репутация: нет
Всего: нет



а что мешает в 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);
}


ПС: код ужасен, знаю. Но суть,я думаю,передал.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0777 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.