#cpp #перегрузка_операторов
Доброго времени суток! Можете понятно объяснить про перегрузку операторов?
Нужно создать класс для представления простой дроби, с чем я справилась, но никак
не могу понять, как перегрузить операции +, - и так далее.
class SimpleFraction
{
private:
int a,
b;
public:
SimpleFraction(int a1, int a2)
{
setSimpleFraction(a1, a2 );
if (a2 == 0)
throw std::runtime_error("zero division error");
}
void setSimpleFraction( int a1, int a2)
{
a = a1;
b = a2;
}
void getSimpleFraction()
{
cout << a << "/"<< b ;
}
};
Классы только начала изучать, так что могут быть ошибки
Ответы
Ответ 1
У вас тут, как говорится, корова не валялась :) Вы должны, вообще-то, после каждого действия дробь упрощать - искать НОД числителя и знаменателя и сокращать... Далее - зачем вам setSimpleFraction? Это можно сделать просто в конструкторе... Словом, должно быть примерно так: class SimpleFraction { static int gcd(int m, int n) // Вычисление НОД { while(m && n) if (m < n) n %= m; else m %= n; return (m == 0) ? n : m; } private: int a, b; public: SimpleFraction(int a1 = 0, int a2 = 1):a(a1),b(a2) { if (a2 == 0) throw std::runtime_error("zero division error"); } // Нас устраивают копирование и присваивание по умолчанию SimpleFraction(const SimpleFraction&) = default; SimpleFraction& operator=(const SimpleFraction&) = default; // Перегрузка оператора вывода в поток friend ostream& operator<<(ostream&out,const SimpleFraction& f) { return out << f.a << "/" << f.b; } friend SimpleFraction operator +(const SimpleFraction&x, const SimpleFraction&y) { int a = x.a*y.b + x.b*y.a; // Числитель int b = x.b*y.b; // Знаменатель int n = gcd(a,b); // НОД return SimpleFraction(a/n,b/n); } SimpleFraction operator -(const SimpleFraction&y) const { int aa = a*y.b - b*y.a; // Числитель int bb = b*y.b; // Знаменатель int n = gcd(aa,bb); // НОД return SimpleFraction(aa/n,bb/n); } friend SimpleFraction operator *(const SimpleFraction&x, const SimpleFraction&y) { int a = x.a*y.a; // Числитель int b = x.b*y.b; // Знаменатель int n = gcd(a,b); // НОД return SimpleFraction(a/n,b/n); } }; int main() { SimpleFraction a(2,3), b(3,5), c(4,9); SimpleFraction x = a+b; cout << x << endl; x = c*b; cout << x << endl; x = a-c; cout << x << endl; } перегрузка операторов - это просто функция особого вида, с именем operator @, где @ - тот самый оператор. Может быть членом класса (тогда первый ее неявный параметр - *this, может быть свободной - как в приведенном выше коде. В вашем случае лучше свободная, и возвращающая новое значение типа SimpleFraction - как я сделал с операторами + и *, но можно и член класса - см. оператор -. Они просто вычисляют новую дробь, выполняют ее сокращение, и возвращают новое значение. Так достаточно или что-то надо разъяснить подробнее?

DATA;
$dom = new DOMDocument('1.0', 'UTF-8'); // Инициализация DOMDocument
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); // Заполнение
структуры данными
$xpath = new DOMXPath($dom); // Инициализация DOMXPath нашими данными
$divs = $xpath->query('//div[@id="community_header" and @class="wcommunity_header"]');
// Запрос XPath
foreach ($divs as $div) {
$div->parentNode->removeChild($div); // Удаление найденных элементов
}
echo $dom->saveHTML();
См. демо этого кода.
Запрос XPath означает:
//div - найди все div, в которых
[@id="community_header" - атрибутidравенcommunity_header`
and - а также
@class="wcommunity_header"] - атрибут class равен wcommunity_header.