[英]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
。 這將僅添加到本地vector
的schools
,而不是成員vector
的schools
。 刪除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.