Действительно ли возможно препятствовать тому, чтобы класс RAII-стиля был инстанцирован “анонимно”?

Пошлите электронное письмо с новым паролем.

ВЫЗЫВАЮТ изменение пароля, когда они прибывают и вводят новый пароль.

Это гарантирует, что человек, который хотел пароль, будет единственным только вход в учетную запись.

, Если электронная почта является сниффинговой, кто-то мог бы войти в учетную запись (конечно), но реальная сторона сразу обнаружит это (как их пароль, который Вы просто отправили им, не работает).

Также отправляют подтверждения изменений пароля пользователям.

, Если кто-то получает новый пароль и затем электронное письмо, говоря "спасибо для изменения пароля", они собираются быть скорее озадаченными и будут говорить с администратором, если они не сделали этого.

7
задан Jeff Walden 14 February 2010 в 04:35
поделиться

4 ответа

На самом деле мне пришлось настроить мое решение несколькими способами из варианта, опубликованного Уолдо, но в итоге я получил макро-версию:

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(&notified); }
    ~GuardNotifyReceiver() { assert(notified); }
};
class StateSaver
{
    GuardNotifyReceiver receiver;
  public:
    StateSaver(int i,
               const GuardNotifier& notifier = GuardNotifier())
    {
      receiver.init(notifier)
      saveState();
    }
    ~StateSaver()
    {
      restoreState();
    }
};
3
ответ дан 6 December 2019 в 09:20
поделиться

Я не уверен, что можно что-нибудь сделать во время компиляции. Для проверки во время выполнения вы можете сделать это:

struct SaveMatrix
{
    SaveMatrix(const SaveMatrix& that) {
        assert(this == &that);
        glPushMatrix();
    }
    ~SaveMatrix() { glPopMatrix(); }
};

Что требует, чтобы клиент написал:

SaveMatrix sm(sm);

, и нет способа сделать то же самое для временного без привязки его к идентификатору (в этом случае он не отличается от автоматическая переменная).

10
ответ дан 6 December 2019 в 09:20
поделиться

SaveMatrix save (); тоже не определяет объект . Он объявляет функцию.

Вы очень мало можете сделать, чтобы помешать другим (или себе, FTM) делать что-то еще, чем они хотели. Единственное, о чем я могу думать, - это не писать сам код, а вместо этого писать макрос.

#define SAVE_MATRIX SaveMatrix save ## __LINE__

Однако это довольно некрасиво.

6
ответ дан 6 December 2019 в 09:20
поделиться

Класс никогда не может определить, был ли он создан как временный (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;
}
1
ответ дан 6 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: