Страницы

Поиск по вопросам

суббота, 25 мая 2019 г.

Редирект на 404 страницу

В .htaccess прописал:
ErrorDocument 404 /views/error.html
В скрипте отправляю заголовок:
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true, 404); exit();
Перенаправление не срабатывает. Пробовал и так писать:
header('HTTP/1.1 404 Not Found', true, 404); header('HTTP/1.0 404 Not Found', true, 404); header('HTTP/1.1 404 Not Found'); header('HTTP/1.0 404 Not Found');
Не срабатывает всё равно. Может что-то дописать нужно ещё?


Ответ

ErrorDocument верно срабатывает, когда реально нет страницы. Передача заголовка лично у меня тоже верно сработала, и в целом должна верно срабатывать, если сервер и php верно настроены. Но при этом во втором пункте apache уже не собирается переадресацию какую-то делать, так как он не видит в этом смысла - ErrorDocument срабатывает именно что на реальное отсутствие страницы или отсутствие правил редиректа для запрошенного адреса, когда же страница просто отдает код 404 - это ее дело. Далее подразумевается, что нужно самому вывести нужное.
То есть либо заинклудить целиком страницу, лежащую по пути /views/error.html примерно таким кодом:
if (we_have_404) { header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true, 404); include "/views/error.html"; exit(); }
дабы минимизировать повторяющийся код на сайте, либо выводить что-либо свое.

Операторы перегрузки

Доброго времени суток! Можете понятно объяснить про перегрузку операторов? Нужно создать класс для представления простой дроби, с чем я справилась, но никак не могу понять, как перегрузить операции +, - и так далее.
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 ; } };
Классы только начала изучать, так что могут быть ошибки


Ответ

У вас тут, как говорится, корова не валялась :) Вы должны, вообще-то, после каждого действия дробь упрощать - искать НОД числителя и знаменателя и сокращать...
Далее - зачем вам 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 - как я сделал с операторами + и *, но можно и член класса - см. оператор -
Они просто вычисляют новую дробь, выполняют ее сокращение, и возвращают новое значение.
Так достаточно или что-то надо разъяснить подробнее?