Bacterie*
의 벡터 벡터를 포함하는 클래스 ZoneDeVie
이 있습니다. Bacterie
클래스에는 int 값 energie
(기본적으로 10으로 설정 됨)과 값을 인쇄하는 toString()
함수가 있습니다. ZoneDeVie
생성자에서 2D 테이블을 작성하고 각 셀에 기본 인스턴스 인 Bacterie
을 채 웁니다. 그런 다음, 내 주요 방법으로, Bacterie
의 toString()
을 테이블에 인쇄하여 테스트합니다. 어떤 이유로, 무작위의, 불쾌하게 커진 int (보통 3753512와 같은 것)를 반환합니다. 그러나 ZoneDeVie의 생성자에서 Bacterie의 toString()
메서드를 호출하면 main 메서드가 올바르게 출력됩니다. (전화로 "toString()"ZoneDeVie의 생성자와)C++ 멤버 변수 값은 인쇄 여부에 따라 변경됩니다.
#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;
}
출력 :zdv(9,39) = Energie: 10
출력 (/ OA 통화 w에 ZoneDeVie의 생성자에서 "toString()") :zdv(9,39) = Energie: 4990504
왜 내가 toString() 메서드를 호출하여 main 메서드에서 호출하여 예상대로 작동해야합니까?
에 대한 포인터로 초기화하는 것 같다? – mfontanini
배열의 범위를 벗어나서 쓰거나 읽거나, 그렇지 않아야하는 메모리 일부 또는 초기화되지 않은 기본 유형이나 포인터에 액세스하려면 정의되지 않은 동작이 있어야합니다. – juanchopanza
모든 포인터가 필요한 이유는 무엇입니까? – chris