Страница 1 из 4
Перегрузка операции минус
Добавлено: 04 дек 2015, 20:29
Sereg
Ребята помогите решить!!!
Создать несколько объектов (например, a и b) разработанного класса. Класс – символьная строка. Реализовать для объектов данного класса перегрузку операции - (c=a-b). Содержимое объектов (a,b,c, их строк), до и после выполнения операции, вывести на экран.
Re: Перегрузка операции
Добавлено: 04 дек 2015, 21:07
Decoder
Класс-обёртку для символьной строки написать несложно, проще даже найти уже готовые классы. Со сложением (конкатенацией) двух символьных строк всё вроде понятно. А вот каков должен быть результат от вычитания двух строк? Можно получить хоть какое-то пояснение? От этого будет зависеть алгоритм самой операции вычитания строк.
Re: Перегрузка операции
Добавлено: 04 дек 2015, 21:25
Sereg
Насколько я понял, результатом должно быть вычитание строк, например если в одной встречаются слова как во второй то они должны вычитаться.
Re: Перегрузка операции
Добавлено: 04 дек 2015, 21:32
Romeo
Должны вычитаться все слова, которые есть во второй, или только одно? Если одно, то какое (первое, второе, последнее)? И почему именно по словам должна идти работа, почему не по символам?
Пока ты не узнаешь точные требования для этого оператора, то ты ни только сам не сможешь решить задачу, но тебе даже не поможет весь наш коллективный разум.
Re: Перегрузка операции
Добавлено: 04 дек 2015, 22:01
Sereg
Да лучше будет если вычитание отдельно по символам будет, и если можно то напишите примерный код этой операции.
Re: Перегрузка операции
Добавлено: 05 дек 2015, 10:56
Сионист
Во-первых c=a-b - это две операции: вычитание и присваивание. А во-вторых что такое вычитание строк? Такая операция не известна. Известны операции вычитания: целых чисел, действительных чисел, чисто мнимых чисел, комплексных чисел, кватернионов, октанионов, геометрических векторов одной разрядности, векторов-строк с равным количеством элементов, векторов-столбцов с равным количеством элементов, матриц равных размеров (вектора-строки и вектора-столбцы - частные случаи матриц) и множеств. Остальные операции вычитания не известны, в том числе не известна операция вычитания символьных строк не известна. Перегрузить то можно, но сделать это правильно можно только с точки зрения языка. Единственное, что приходит в голову - это вычитание чисел, заданных своими строчными записями, но такая операция будет вычитанием символьных строк только с точки зрения текста программы, но не семантики заданной такой перегрузкой операции.
Re: Перегрузка операции
Добавлено: 05 дек 2015, 11:19
Romeo
Сионист, ну человек же в предыдущем посте уже указал, что он хочет видеть под этой операцией. Хоть бы раз помог вместо того, чтобы задавать ненужные вопросы.
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.
Re: Перегрузка операции
Добавлено: 05 дек 2015, 11:29
Сионист
Сионист, ну человек же указал, что он хочет видеть под этой операцией. Хоть бы раз помог вместо того, чтобы задавать ненужные вопросы.
То, что он сказал, вообще множествами благуохает.
Re: Перегрузка операции
Добавлено: 05 дек 2015, 11:50
Romeo
Снова ты всё усложняешь без надобности. Человек достаточно определённо указал, что хочет, чтобы вычитание работало посимвольно: иными словами выкинуть из первой строки символы, которые есть во второй строке. Вполне себе студенческая задачка. Нет же, у тебя семантика нарушена, высокие физические материи посылают не коррелирующие друг с другом сигналы, а звёзды стали в не в том порядке на небе. Это всё вода, которую можно лить бесконечно, лишь бы не помогать человеку. Языком болтать все могут...
Re: Перегрузка операции
Добавлено: 05 дек 2015, 11:55
Сионист
Romeo писал(а):Снова ты всё усложняешь без надобности. Человек достаточно определённо указал, что хочет, чтобы вычитание работало посимвольно: иными словами выкинуть из первой строки символы, которые есть во второй строке.
Один простой вопрос: а как вычитаются множества?