c++ - 默认参数覆盖 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。
解决方案
默认情况下,您开始构建 20yo
秒:
std::vector<yo> yos(20);
所有 20 个都有x = 1280
,y = 0
和speed = 1
.
然后,您使用所需的值添加一个额外的值:
yo e(340, 5);
yos.push_back(e);
您现在有 20 个默认构造yo
的 s + 1 和x = 1280
,y = 340
和speed = 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()
之后的下一个元素。erase
i++
例子:
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()) { ... }
推荐阅读
- javascript - 条件语句内的语句 (if)
- python - 如何解决烧瓶生产中的 Unicode 问题,例如 ieeo?
- stripe-payments - Stripe 连接账户是否在测试模式下将付款转移到连接的账户?
- python - python函数返回中断for循环
- html - Bootstrap 的英雄横幅文本对齐问题
- kotlin - 当我单击 RecyclerView 中的单选按钮时,我发现其他按钮被自动选中
- google-cloud-platform - 在 Google Cloud 虚拟机中,是否可以在实例详细信息页面中覆盖容器端口映射?
- javascript - 防止窗口默认滚动
- javascript - 如何获取过滤器选择的更新计数?
- python - Pandas 数据框 - 将 N 行从一个数据框移动到另一个数据框