C ++成员变量值根据是否打印出来而更改

时间:2012-05-04 11:23:43

标签: c++

我有一个班级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()方法,以使其按预期运行?

2 个答案:

答案 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)

此代码存在几个问题。

  1. 目前尚不清楚Bacterie的默认构造函数是什么。

  2. 目前尚不清楚ZoneDeVie::tableau是什么以及如何使用本地向量bacvec

  3. 目前尚不清楚如何定义复制构造函数和类operator=的{​​{1}}(两者都在ZoneDeVie中使用)。

  4. 您的表中的所有条目似乎都使用指向同一main() Bacterie

  5. 的指针进行初始化