[英]Why does the constructor returns an empty vector?
我正在為我的大學 CS 課程做一個年終項目,但是我已經被這個 function 卡住了好幾天,我沒有得到太多幫助,我的時間開始不多了。 你能幫我解決這個問題嗎?
hpp 中的 function 定義包含一個構造函數:
class Grille {
vector<vector<Place>> grille;
public:
//Constructor
Grille();
構造函數是這樣實現的:
Grille::Grille() {
vector<vector<Place>> grille(20);
vector<Place> vp(20);
for(int i=0;i<20;i++) {
for(int j=0;j<20;j++) {vp[j] = Place{Coord{i+1,j+1}};}
grille[i] = vp;
//cout << grille[i].size() << endl;
}
}
這是 Grille 的 << 運算符(它是 ant 模擬,因此需要使用一些屬性來可視化網格):
ostream& operator<<(ostream& out, Grille& g) {
for(int i=0;i<20;i++) {
for(int j=0;j<20;j++) {
char o = '.';
if(g.grille[i][j].contientNid()) {o = 'N';}
else if(g.grille[i][j].contientSucre()) {o = 'S';}
else if(g.grille[i][j].numeroFourmi() != 1) {o = 'f';}
out << o;
}
out << endl;
}
out << endl;
return out;
}
這是我使用的測試工具(它是 Doctest,雖然我主要將它用作主要功能):
TEST_SUITE_BEGIN("Grille");
TEST_CASE("Testing Grille") {
Grille g = Grille();
cout << g.getGrilleSize() << endl;
cout << 't' << endl;
cout << g;
}
TEST_SUITE_END;
構造函數中的格柵大小(第 8 行注釋 cout)正確為 20,但構造函數后的大小(測試事物中的 cout,第 4 行)顯示為 0。我做錯了什么?
構造函數聲明了一個局部變量vector<vector<Place>> grille(20);
即遮蔽(隱藏)成員變量vector<vector<Place>> grille;
.
您應該刪除局部變量,而是通過構造函數的成員初始化列表來初始化成員變量grille
。
Grille::Grille() : grille(20) {
vector<Place> vp(20);
for(int i=0;i<20;i++) {
for(int j=0;j<20;j++) {vp[j] = Place{Coord{i+1,j+1}};}
grille[i] = vp;
//cout << grille[i].size() << endl;
}
}
vector<vector<Place>> grille(20);
在構造函數中將grille
聲明為局部變量。 它隱藏同名的數據成員。 不要聲明另一個同名的向量,你會沒事的:
Grille::Grille() {
grille.resize(20);
vector<Place> vp(20);
for(int i=0;i<20;i++) {
for(int j=0;j<20;j++) {vp[j] = Place{Coord{i+1,j+1}};}
grille[i] = vp;
//cout << grille[i].size() << endl;
}
}
或者更確切地說,使用成員初始化列表。 對於復雜的成員構造,可以使用私有 static 或免費函數:
std::vector<Place> init_vect() { .... }
Grille::Grille() : grille(init_vect()) {}
PS:構造函數不“返回向量”,它們構造對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.