我有一个班级ZoneDeVie
,其中包含Bacterie*
向量的向量。 Bacterie
类包含一个int值energie
(默认设置为10)和一个打印该值的toString()
函数。在ZoneDeVie
构造函数中,我构建了2D表,使用Bacterie
的默认实例填充每个单元格。然后,在我的main方法中,我通过打印表中最后toString()
的{{1}}进行测试。出于某种原因,它返回一个随机的,令人讨厌的大型int(通常类似于:3753512);但是,如果我在ZoneDeVie的构造函数中调用Bacterie的Bacterie
方法,则主方法将正确打印出来。
toString()
输出(在ZoneDeVie的构造函数中调用“toString()”): #include <iostream>
#include <sstream>
#include <vector>
using namespace std;
class Bacterie {
public:
Bacterie() { this->energie = 10; }
string toString() {
stringstream ss;
ss << "Energie: " << this->energie;
return ss.str();
}
protected:
int energie;
};
class ZoneDeVie {
public:
ZoneDeVie(int width, int height) {
Bacterie* bac = new Bacterie();
// without this [following] line, the call to `toString`
// in the main method will return an obnoxiously-large value
//bac->toString();
for (int i=0; i<height; i++) {
vector<Bacterie*> bacvec = vector<Bacterie*>();
this->tableau.push_back(bacvec);
for (int j=0; j<width; j++) {
this->tableau[i].push_back(bac);
}
}
}
vector<vector<Bacterie*> > tableau;
};
int main(int argc, char *argv[]) {
int x,y;
x = 9; y = 39;
ZoneDeVie zdv = ZoneDeVie(10,40);
cout << "zdv(" << x << "," << y << ") = " << zdv.tableau[x][y]->toString();
return 0;
}
输出(没有在ZoneDeVie的构造函数中调用“toString()”): zdv(9,39) = Energie: 10
为什么在世界上我需要在main方法中调用它之前调用我的toString()方法,以使其按预期运行?
答案 0 :(得分:1)
交换for循环中的结束条件。您应首先遍历width
,然后再遍历height
:
class ZoneDeVie {
public:
ZoneDeVie(int width, int height) {
Bacterie* bac = new Bacterie();
for (int i=0; i<width; i++) {
vector<Bacterie*> bacvec = vector<Bacterie*>();
this->tableau.push_back(bacvec);
for (int j=0; j<height; j++) {
this->tableau[i].push_back(bac);
}
}
}
vector<vector<Bacterie*> > tableau;
};
这会编译并提供正确的输出。
答案 1 :(得分:1)
此代码存在几个问题。
目前尚不清楚Bacterie
的默认构造函数是什么。
目前尚不清楚ZoneDeVie::tableau
是什么以及如何使用本地向量bacvec
。
目前尚不清楚如何定义复制构造函数和类operator=
的{{1}}(两者都在ZoneDeVie
中使用)。
您的表中的所有条目似乎都使用指向同一main()
Bacterie