繁体   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