【问题标题】:C++ classes and vectorsC++ 类和向量
【发布时间】:2019-03-15 04:31:32
【问题描述】:

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

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;

【问题讨论】:

  • newSchool 是一个指针,所以&amp;newSchool 是一个指向指针的指针。
  • 而且这些都没有编译的机会; addSchool 既不是静态类成员,也不是 school ** 参数,两者都会在 main 的调用中用一行代码中断编译。此外,虽然不是编译时错误,但 school::addSchool 中的本地 schools 对象隐藏了成员变量 schools,这是一个平面逻辑错误。
  • newSchool 是一个存在于堆栈中的值,如果在该堆栈被拆除后使用任何尝试存储其地址的尝试,都将导致 oldSchool
  • 你为什么在代码级别使用“HEADER FILE”和“CPP文件”和“MAIN FUNCTION”。请剪切并粘贴您的代码。似乎缺少一些部分。

标签: c++ class pointers vector


【解决方案1】:

这里有几个问题

  • 像调用静态函数一样调用非静态成员函数。把函数原型改成这样:

    static void addSchool(school *s);

  • 在函数addSchool 中传递一个指向school 的指针,该函数只接受一个指向school 的指针。将函数调用改为:

    school::addSchool(newSchool);

  • addSchool 函数中声明schools 的本地vector,而不是使用已经可用的private 成员vector&lt;school *&gt; schools。这只会添加到schools 的本地vector,而不是schools 的成员vector。删除addSchool函数中的以下行

    vector&lt;school *&gt; schools;

  • addSchool 函数中再次为school 分配内存。这将导致内存泄漏。您只需分配一次内存。如果您想在main 中执行此操作,请删除addSchool 函数中的以下行。

    s = new school();

  • 删除在main 中分配的内存只能在程序结束时进行。否则,您将面临vector 无效的指针。

我认为:

  • schoolsvector 也应该是 static,因为它不是特定于特定实例化的。在这种情况下,将schoolsvector 的声明更改为:

    static vector&lt;school *&gt; schools;

Demo

【讨论】:

    【解决方案2】:

    这里似乎有两个主要问题。您遇到的错误在于您如何调用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

    【讨论】:

      猜你喜欢
      • 2013-03-28
      • 2017-09-05
      • 1970-01-01
      • 2020-07-14
      • 2016-06-09
      • 2019-12-27
      • 2019-08-09
      • 2012-04-01
      • 1970-01-01
      相关资源
      最近更新 更多