簡體   English   中英

C ++類和向量

[英]C++ classes and vectors

我很困惑! 我不斷收到以下錯誤消息:

addSchool未在范圍內聲明

和,

呼叫school::addschool()沒有匹配功能school::addschool()

我看不出這些是如何宣布的。 (我也是編程的新手)

School是一個類,這個類的成員之一是向量指針。

.h文件:

class school {
private:
    vector<school*> schools;

public:
    school();
    void addSchool(school *s);
};

.cpp文件:

void school::addSchool(school *s){
    vector<school *> schools;
    s = new school();
    schools.push_back(s);
}

main功能:

school *newSchool = new school();
school::addSchool(&newSchool);
delete newSchool;

這里有幾個問題

  • 將非靜態成員函數調用為靜態函數。 將函數原型更改為:

    static void addSchool(school *s);

  • addSchool函數中傳遞指向school指針,該函數僅使用指向school的指針。 將函數調用更改為:

    school::addSchool(newSchool);

  • addSchool函數中聲明schools的本地vector ,而不是使用已經可用的private成員vector<school *> schools 這將僅添加到本地vectorschools ,而不是成員vectorschools 刪除addSchool函數中的以下行

    vector<school *> schools;

  • addSchool函數中再次為school分配內存。 這將導致內存泄漏。 您只需分配一次內存。 如果要在main執行此操作,請在addSchool函數中刪除以下行。

    s = new school();

  • 刪除main分配的內存只能在程序結束時完成。 否則,您將被懸掛一個無效的指針vector

我覺得:

  • schools vector也應該是static因為它不特定於特定的實例。 在這種情況下,將schools vector聲明改為:

    static vector<school *> schools;

演示

這里似乎有兩個主要問題。 您遇到的錯誤在於您如何調用addSchool() 在將靜態函數聲明為成員時,您正在使用該語法調用靜態函數。 將其稱為成員:

school.addSchool(newSchool);

注意使用. 而不是:: ,而且newSchool已經是一個指針,所以不要使用它的地址。 (正如其他人已經指出的那樣)

其他問題是addSchool方法中的運行時錯誤。 您正在創建本地向量,而不使用該成員。 您也忽略了發送的參數。

void school::addSchool(school *s) {
    for( i=0; i < s->size(); i++) {
        this.schools.push_back(s[i]);
    }
}

現在我寫出來了,我意識到這個類實際上應該是一個更大的邏輯問題。 它是一所學校,其中包含學校列表,那么您是在該列表中添加學校還是合並列表? 雖然這些事情對鏈接列表和樹有意義,但你的例子說“學校”,所以我會重新考慮它。 也許你的班級應該是一個包含學校名單的學區:

class District{
private:
    vector<school *> schools; // school declared elsewhere
public:
    District();
    inline int Size() { return this.schools.size(); };
    inline int Get(int i) { return this.schools[i]; };
    void addSchool(school *s);
    void addSchools(District *d);
}

// adding to the list
void District::addSchool(school *s) {
    this.schools.push_back(s);
}

// adding the contents of another like class, consider operator overloading + instead
void District::addSchools(District *d) {
    for( i=0; i < d->Size(); i++) {
        this.schools.push_back( d->Get(i) );
    }
}

或者,如果要將單個靜態函數用作主列表,請查找Singleton設計模式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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