簡體   English   中英

為什么構造函數返回一個空向量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM