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