Пошлите электронное письмо с новым паролем.
ВЫЗЫВАЮТ изменение пароля, когда они прибывают и вводят новый пароль.
Это гарантирует, что человек, который хотел пароль, будет единственным только вход в учетную запись.
, Если электронная почта является сниффинговой, кто-то мог бы войти в учетную запись (конечно), но реальная сторона сразу обнаружит это (как их пароль, который Вы просто отправили им, не работает).
Также отправляют подтверждения изменений пароля пользователям.
, Если кто-то получает новый пароль и затем электронное письмо, говоря "спасибо для изменения пароля", они собираются быть скорее озадаченными и будут говорить с администратором, если они не сделали этого.
На самом деле мне пришлось настроить мое решение несколькими способами из варианта, опубликованного Уолдо, но в итоге я получил макро-версию:
class GuardNotifier
{
bool* notified;
public:
GuardNotifier() : notified(NULL) { }
void init(bool* ptr) { notified = ptr; }
~GuardNotifier() { *notified = true; }
};
class GuardNotifyReceiver
{
bool notified;
public:
GuardNotifyReceiver() : notified(false) { }
void init(const GuardNotifier& notifier)
{ const_cast<GuardNotifier&>(notifier).init(¬ified); }
~GuardNotifyReceiver() { assert(notified); }
};
class StateSaver
{
GuardNotifyReceiver receiver;
public:
StateSaver(int i,
const GuardNotifier& notifier = GuardNotifier())
{
receiver.init(notifier)
saveState();
}
~StateSaver()
{
restoreState();
}
};
Я не уверен, что можно что-нибудь сделать во время компиляции. Для проверки во время выполнения вы можете сделать это:
struct SaveMatrix
{
SaveMatrix(const SaveMatrix& that) {
assert(this == &that);
glPushMatrix();
}
~SaveMatrix() { glPopMatrix(); }
};
Что требует, чтобы клиент написал:
SaveMatrix sm(sm);
, и нет способа сделать то же самое для временного без привязки его к идентификатору (в этом случае он не отличается от автоматическая переменная).
SaveMatrix save ();
тоже не определяет объект . Он объявляет функцию.
Вы очень мало можете сделать, чтобы помешать другим (или себе, FTM) делать что-то еще, чем они хотели. Единственное, о чем я могу думать, - это не писать сам код, а вместо этого писать макрос.
#define SAVE_MATRIX SaveMatrix save ## __LINE__
Однако это довольно некрасиво.
Класс никогда не может определить, был ли он создан как временный (SaveMatrix ()) или как переменная (SaveMatrix save;). Я думаю, что лучший способ остановить программиста, который делает это без использования стека или макросов, - это принудительно вызвать функцию-член после построения, например:
class RAII
{
public:
bool valid;
RAII()
: valid(false)
{
cout << "RAII ctor" << endl;
}
void Do()
{
valid = true;
}
~RAII()
{
assert(valid);
cout << "RAII dtor" << endl;
}
};
Тогда это работает следующим образом:
{
// Intended use
RAII raii;
raii.Do();
cout << "Some task" << endl;
}
{
// Woops: forgot Do()
RAII raii;
cout << "Some task" << endl;
}
{
// Woops: forgot Do()
RAII();
cout << "Some task" << endl;
}
{
// Programmer shot self in foot, hopefully the act of typing this would make them realise that
RAII().Do();
cout << "Some task" << endl;
}