C ++类和向量

时间:2019-03-15 04:31:33

标签: c++ class pointers vector

对此我感到困惑!我不断收到以下错误消息:

  

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;

2 个答案:

答案 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