首页 > 解决方案 > 默认参数覆盖 C++

问题描述

我有一个问题,当你制作一个对象并在其中输入参数时,例如foo f(0,5,0);对象默认参数接管并替换我在制作对象时输入的参数。我希望这是有道理的,如果我需要更改某些内容,请随时发表评论。

代码:yo.h

class yo {
public:
    yo(int Y=0, int Speed=1);

    void move(); //where i use the varibles
    int getx() { return x;}

private:

    int x, y, speed;
};

哟.cpp


yo::yo(int Y, int Speed)
    :x(1280), y(Y), speed(Speed)
{}

void yo::move() {
    x -= speed;
    std::cout << speed << std::endl;
}

主文件

std::vector<yo> yos(20);

void spawnYos() {
    yo e(340, 5);
    yos.push_back(e);
}

int main() {
    spawnYos();
    while(true) {
        for (int i = 0; i != yos.size(); i++) {
            yos.at(i).move();
            if (yos.at(i).getx() < 0 or yos.at(i).getx() > 1290) {
                yos.erase(yos.begin() + i);
            }
        }
    }
    return 0;
}

这将yos.at(i).move();打印默认参数 ( 1),而我特别指出yo e(340, 5);。它应该打印 5。

标签: c++

解决方案


默认情况下,您开始构建 20yo秒:

std::vector<yo> yos(20);

所有 20 个都有x = 1280,y = 0speed = 1.

然后,您使用所需的值添加一个额外的值:

yo e(340, 5);
yos.push_back(e);

您现在有 20 个默认构造yo的 s + 1 和x = 1280,y = 340speed = 5.

根据您的描述,我认为您需要 20 个yo(340, 5)元素。您可以通过在构建20 个元素yo时添加复制来创建它们:vector

std::vector<yo> yos(20, {340, 5});

spawnYos()现在可以删除并且yos可以将声明移入main而不是使用全局变量。

还要更正循环i中的步进。for如果你是一个元素,如果你无条件地这样做erase,你将错过i != yos.size()条件错过dmove()之后的下一个元素。erasei++

例子:

int main() {
    std::vector<yo> yos(20, {340, 5});

    while(true) {
        for (size_t i = 0; i != yos.size();) {
            yos.at(i).move();
            if (yos.at(i).getx() < 0 or yos.at(i).getx() > 1290) {
                yos.erase(yos.begin() + i);
            } else {
                ++i; // only step i if you don't remove an element
            }
        }
    }
    return 0;
}

注意:该程序无法正常终止。此类程序具有未定义的行为,因此您需要为程序提供一些干净的退出方式。我建议改变

while(true) { ... }

while(!yos.empty()) { ... }

推荐阅读