C++构造函数和静态成员

3

我试着写了些东西,但是我不知道代码出了什么问题。我的类有一个静态成员、默认构造函数和一个重载的构造函数。

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();

我原以为,由于我正在调用重载的构造函数,它还是会将指针添加到向量中。但是,很明显这并没有发生。
有人能解释一下发生了什么吗?
顺祝商祺,
Bob

1
我这里没有看到任何类。你能提供一个最小化、完整化、可重现化的代码示例吗? - Yksisarvinen
1
你认为 Remote() { Remote(1); } 是做什么的? - Chad
1
使用调试器逐步执行代码和/或在发生事件时输出一些调试信息,你会感到惊讶的。 - Ulrich Eckhardt
2
@SSJVegetto 因为 Remote(1) 在构造函数的 body 中被调用,所以它 不是 被委托的,而是创建了一个立即超出作用域的临时对象。 - Chad
1
@Bob:实现以下代码:Remote& operator=(const Remote&)Remote(const Remote&)。对于第一个函数,目前似乎=default就可以了。而对于第二个函数,则应该加上channels.push_back(this);。还有两个移动版本需要考虑:Remote& operator=(Remote&&)Remote(Remote&&) - Jarod42
显示剩余7条评论
1个回答

6
构造函数
Remote() {
    Remote(1);
    std::cout << "Remote() called.\n";
}

这并没有向 channels 向量中添加任何内容。在 这个上下文中Remote(1) 不是一个委派构造函数。

请尝试使用以下代码:

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

请看这个例子:https://ideone.com/ahauPV

2
这是正确的,但你也忘了提到同样重要的一点。静态数组未能更新的原因不仅仅是这个。如果可以的话,请更新你的答案以包括其他原因。 - Sam Varshavchik
哎呀,压力太大了。你是指更新数组但立即超出作用域(因此擦除自身)的临时变量吗?如果不是,你得给我一个提示 :) - Chad
3
不行,继续尝试。类中还完全缺少另一项内容,这也是必需的,以便更新静态数组以涵盖可以以任何形式或方式构造的该类每个可能的实例。尝试想出在没有调用任何现有构造函数的情况下构建此类实例的任何其他可能方式(这应该很明显)。 - Sam Varshavchik
@SamVarshavchik :你是指拷贝构造函数吗? - Bob
1
五个规则的内容是关于复制/移动构造函数的。 - Chad
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接