Перегрузка операции минус

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Sereg
Сообщения: 8
Зарегистрирован: 04 дек 2015, 20:25

Ребята помогите решить!!!
Создать несколько объектов (например, a и b) разработанного класса. Класс – символьная строка. Реализовать для объектов данного класса перегрузку операции - (c=a-b). Содержимое объектов (a,b,c, их строк), до и после выполнения операции, вывести на экран.
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Класс-обёртку для символьной строки написать несложно, проще даже найти уже готовые классы. Со сложением (конкатенацией) двух символьных строк всё вроде понятно. А вот каков должен быть результат от вычитания двух строк? Можно получить хоть какое-то пояснение? От этого будет зависеть алгоритм самой операции вычитания строк.
Поумнеть несложно, куда труднее от дури избавиться.
Sereg
Сообщения: 8
Зарегистрирован: 04 дек 2015, 20:25

Насколько я понял, результатом должно быть вычитание строк, например если в одной встречаются слова как во второй то они должны вычитаться.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Должны вычитаться все слова, которые есть во второй, или только одно? Если одно, то какое (первое, второе, последнее)? И почему именно по словам должна идти работа, почему не по символам?

Пока ты не узнаешь точные требования для этого оператора, то ты ни только сам не сможешь решить задачу, но тебе даже не поможет весь наш коллективный разум.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Sereg
Сообщения: 8
Зарегистрирован: 04 дек 2015, 20:25

Да лучше будет если вычитание отдельно по символам будет, и если можно то напишите примерный код этой операции.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Во-первых c=a-b - это две операции: вычитание и присваивание. А во-вторых что такое вычитание строк? Такая операция не известна. Известны операции вычитания: целых чисел, действительных чисел, чисто мнимых чисел, комплексных чисел, кватернионов, октанионов, геометрических векторов одной разрядности, векторов-строк с равным количеством элементов, векторов-столбцов с равным количеством элементов, матриц равных размеров (вектора-строки и вектора-столбцы - частные случаи матриц) и множеств. Остальные операции вычитания не известны, в том числе не известна операция вычитания символьных строк не известна. Перегрузить то можно, но сделать это правильно можно только с точки зрения языка. Единственное, что приходит в голову - это вычитание чисел, заданных своими строчными записями, но такая операция будет вычитанием символьных строк только с точки зрения текста программы, но не семантики заданной такой перегрузкой операции.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист, ну человек же в предыдущем посте уже указал, что он хочет видеть под этой операцией. Хоть бы раз помог вместо того, чтобы задавать ненужные вопросы.

Sereg, для того, чтобы это реализовать, в классе должен быть объявлен "оператор -" и конструктор копирования. В операторе будет код по конструированию нового объекта с новыми данными, как посимвольная разность строк a и b, а затем этот вновь созданный объект с помощью конструктора копирования будет скопирован объект c.

Если мы воспользуемся STL-евским классом для работы со строками std::string, то конструктор копирования нам не придётся писать самостоятельно (хватит вполне того, который будет сгенерирован автоматически компилятором). Останется только написать "оператор -".

Код: Выделить всё

#include <string>

class MyString
{
public:
   // конструктор по умолчанию
   MyString() : m_str() {}

   // конструктор для создания объекта MyString из std::string
   MyString(const std::stirng& str) : m_str(str) {}

   // оператор -
   MyString operator - (const MyString& rhs);

private:
   std::string m_str;
}

MyString MyString: :o perator - (const MyString& rhs)
{
   // код оператора
}

int main()
{
   MyString a = "Hello";
   MyString b = "He";

   MyString c = a - b; // "llo"

   return 0;
}
"Оператор -" должен создать на стеке новый объект типа MyString (скажем result), затем пробежаться по строке this->m_str, и для каждого её символа поискать есть ли такой символ в rhs.m_str, и если есть, то добавить этот символ в result.m_str. Бегать по строке можно либо итератором, либо используя индекс - как будет удобнее. Найти в строке символ можно методом find. В конце работы оператор должен вернуть объект result.

Здесь можно подробнее почитать о том, как работать с классом std::string.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Сионист, ну человек же указал, что он хочет видеть под этой операцией. Хоть бы раз помог вместо того, чтобы задавать ненужные вопросы.
То, что он сказал, вообще множествами благуохает.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Снова ты всё усложняешь без надобности. Человек достаточно определённо указал, что хочет, чтобы вычитание работало посимвольно: иными словами выкинуть из первой строки символы, которые есть во второй строке. Вполне себе студенческая задачка. Нет же, у тебя семантика нарушена, высокие физические материи посылают не коррелирующие друг с другом сигналы, а звёзды стали в не в том порядке на небе. Это всё вода, которую можно лить бесконечно, лишь бы не помогать человеку. Языком болтать все могут...
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Снова ты всё усложняешь без надобности. Человек достаточно определённо указал, что хочет, чтобы вычитание работало посимвольно: иными словами выкинуть из первой строки символы, которые есть во второй строке.
Один простой вопрос: а как вычитаются множества?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить