对此我感到困惑!我不断收到以下错误消息:
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;
答案 0 :(得分:0)
此处有一些问题:
像调用静态函数一样调用非静态成员函数。将函数原型更改为此:
static void addSchool(school *s);
在函数school
中传递指向addSchool
的指针,该函数仅使用指向school
的指针。将函数调用更改为此:
school::addSchool(newSchool);
在vector
函数中声明schools
的本地addSchool
,而不使用现有的private
成员vector<school *> schools
。这只会添加到vector
的本地schools
中,而不会添加到vector
的成员schools
中。在addSchool
函数
vector<school *> schools;
在school
函数中再次为addSchool
分配内存。这将导致内存泄漏。您只需要分配一次内存。如果要在main
中执行此操作,请在addSchool
函数中删除以下行。
s = new school();
仅在程序结束时才删除main
中分配的内存。否则,您将陷入vector
无效的指针中。
我认为:
vector
中的schools
也应该是static
,因为它并不特定于特定的实例。在这种情况下,请将vector
的{{1}}的声明更改为:
schools
请参见 Demo
答案 1 :(得分:0)
这里似乎有两个主要问题。您收到的错误在于如何调用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 design pattern。