Перегрузка операции минус
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Ребята помогите решить!!!
Создать несколько объектов (например, a и b) разработанного класса. Класс – символьная строка. Реализовать для объектов данного класса перегрузку операции - (c=a-b). Содержимое объектов (a,b,c, их строк), до и после выполнения операции, вывести на экран.
Создать несколько объектов (например, a и b) разработанного класса. Класс – символьная строка. Реализовать для объектов данного класса перегрузку операции - (c=a-b). Содержимое объектов (a,b,c, их строк), до и после выполнения операции, вывести на экран.
Класс-обёртку для символьной строки написать несложно, проще даже найти уже готовые классы. Со сложением (конкатенацией) двух символьных строк всё вроде понятно. А вот каков должен быть результат от вычитания двух строк? Можно получить хоть какое-то пояснение? От этого будет зависеть алгоритм самой операции вычитания строк.
Поумнеть несложно, куда труднее от дури избавиться.
Насколько я понял, результатом должно быть вычитание строк, например если в одной встречаются слова как во второй то они должны вычитаться.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Должны вычитаться все слова, которые есть во второй, или только одно? Если одно, то какое (первое, второе, последнее)? И почему именно по словам должна идти работа, почему не по символам?
Пока ты не узнаешь точные требования для этого оператора, то ты ни только сам не сможешь решить задачу, но тебе даже не поможет весь наш коллективный разум.
Пока ты не узнаешь точные требования для этого оператора, то ты ни только сам не сможешь решить задачу, но тебе даже не поможет весь наш коллективный разум.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Да лучше будет если вычитание отдельно по символам будет, и если можно то напишите примерный код этой операции.
Во-первых c=a-b - это две операции: вычитание и присваивание. А во-вторых что такое вычитание строк? Такая операция не известна. Известны операции вычитания: целых чисел, действительных чисел, чисто мнимых чисел, комплексных чисел, кватернионов, октанионов, геометрических векторов одной разрядности, векторов-строк с равным количеством элементов, векторов-столбцов с равным количеством элементов, матриц равных размеров (вектора-строки и вектора-столбцы - частные случаи матриц) и множеств. Остальные операции вычитания не известны, в том числе не известна операция вычитания символьных строк не известна. Перегрузить то можно, но сделать это правильно можно только с точки зрения языка. Единственное, что приходит в голову - это вычитание чисел, заданных своими строчными записями, но такая операция будет вычитанием символьных строк только с точки зрения текста программы, но не семантики заданной такой перегрузкой операции.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Сионист, ну человек же в предыдущем посте уже указал, что он хочет видеть под этой операцией. Хоть бы раз помог вместо того, чтобы задавать ненужные вопросы.
Sereg, для того, чтобы это реализовать, в классе должен быть объявлен "оператор -" и конструктор копирования. В операторе будет код по конструированию нового объекта с новыми данными, как посимвольная разность строк a и b, а затем этот вновь созданный объект с помощью конструктора копирования будет скопирован объект c.
Если мы воспользуемся STL-евским классом для работы со строками std::string, то конструктор копирования нам не придётся писать самостоятельно (хватит вполне того, который будет сгенерирован автоматически компилятором). Останется только написать "оператор -".
"Оператор -" должен создать на стеке новый объект типа MyString (скажем result), затем пробежаться по строке this->m_str, и для каждого её символа поискать есть ли такой символ в rhs.m_str, и если есть, то добавить этот символ в result.m_str. Бегать по строке можно либо итератором, либо используя индекс - как будет удобнее. Найти в строке символ можно методом find. В конце работы оператор должен вернуть объект result.
Здесь можно подробнее почитать о том, как работать с классом std::string.
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;
}
Здесь можно подробнее почитать о том, как работать с классом std::string.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
То, что он сказал, вообще множествами благуохает.Сионист, ну человек же указал, что он хочет видеть под этой операцией. Хоть бы раз помог вместо того, чтобы задавать ненужные вопросы.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Снова ты всё усложняешь без надобности. Человек достаточно определённо указал, что хочет, чтобы вычитание работало посимвольно: иными словами выкинуть из первой строки символы, которые есть во второй строке. Вполне себе студенческая задачка. Нет же, у тебя семантика нарушена, высокие физические материи посылают не коррелирующие друг с другом сигналы, а звёзды стали в не в том порядке на небе. Это всё вода, которую можно лить бесконечно, лишь бы не помогать человеку. Языком болтать все могут...
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Один простой вопрос: а как вычитаются множества?Romeo писал(а):Снова ты всё усложняешь без надобности. Человек достаточно определённо указал, что хочет, чтобы вычитание работало посимвольно: иными словами выкинуть из первой строки символы, которые есть во второй строке.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.