C ++ Конструкторы и статические члены - PullRequest
0 голосов
/ 09 октября 2018

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

class Remote
{
public:
    static std::vector<Remote*> channels;

    static void interrupt() {
        for (Remote* r : channels) {
            r->ProcessInterrupt();
        };
    }

    void ProcessInterrupt() {
        std::cout << "ProcessInterrupt called.";
    };

    Remote(const int a) {
        std::cout << "Remote(const int a) called.\n";
        channels.push_back(this);
    }
    Remote() {
        Remote(1);
        std::cout << "Remote() called.\n";
    }
    ~Remote() {
        std::vector<Remote *>::iterator ch = std::find(channels.begin(), channels.end(), this);
        if (ch != channels.end()) {
            channels.erase(ch);
        };
    }
};

В main.cpp я объявляю два экземпляра класса Remote.Теперь я заметил, что если я создаю их экземпляр с помощью конструктора по умолчанию, указатели не добавляются в вектор.Затем я попытался использовать перегруженный конструктор, и он добавляет его в вектор.

Remote r1 = Remote();
Remote r2 = Remote(1);
std::cout << Remote::channels.size() << "\n";
Remote::interrupt();

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

Может ли кто-нибудь объяснить, что происходит?

С уважением,

Боб

1 Ответ

0 голосов
/ 09 октября 2018

Конструктор

Remote() {
    Remote(1);
    std::cout << "Remote() called.\n";
}

Ничего не добавляет к вектору channels.Remote(1) в этот контекст не является делегирующим конструктором.

Попробуйте вместо этого:

Remote() : Remote(1) {
    std::cout << "Remote() called.\n";
}

См. Пример здесь: https://ideone.com/ahauPV

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...