首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在c++的继承类中声明构造函数时出错

在c++的继承类中声明构造函数时出错
EN

Stack Overflow用户
提问于 2020-04-29 18:28:14
回答 2查看 109关注 0票数 0

我得到了两个类,Person和Student,其中Person是基类,而Student是派生类。不允许对Person类或main函数进行任何更改。注意到Student继承了Person的所有属性。一个学生类构造函数,它有参数:一个字符串,名字一个字符串,姓氏一个整数,id。测试分数的整数数组(或向量)。char calculate()方法,该方法计算学生对象的平均值,并返回代表其计算平均值的年级字符。示例输入-

代码语言:javascript
运行
AI代码解释
复制
Heraldo Memelli 8135627 2 100 80

预期输出-

代码语言:javascript
运行
AI代码解释
复制
Name: Memelli, Heraldo ID: 8135627 Grade: O

我得到的错误是在声明构造函数的时候,你能解释一下为什么吗,还有你建议的其他方法吗?提前谢谢。这是我的代码-

代码语言:javascript
运行
AI代码解释
复制
    #include <iostream>

    #include <vector>

    using namespace std;
    class Person {
      protected:
        string firstName;
      string lastName;
      int id;
      public:
        Person(string firstName, string lastName, int identification) {
          this - > firstName = firstName;
          this - > lastName = lastName;
          this - > id = identification;
        }
      void printPerson() {
        cout << "Name: " << lastName << ", " << firstName << "\nID: " << id << "\n";
      }
    };
    class Student: public Person {
      private: vector < int > testScores;
      public: Student(string firstName, string lastName, int identification, vector < int > & scores) {
        for (int i = 0; i < & scores.size(); i++)
          this - > testScores.pushback( & scores[i]);
      }
      char calculate() {
        int avg, sum = 0, count = 0;
        for (int i = testScores.begin(); i < testScores.size(); i++) {
          sum = sum + testScores[i];
          count++;
        }
        avg = sum / count;
        if (avg >= 90 && avg <= 100)
          return ('O');
        else if (avg >= 80 && avg < 90)
          return ('E');
        else if (avg >= 70 && avg < 80)
          return ('A');
        else if (avg >= 55 && avg < 70)
          return ('P');
        else if (avg >= 40 && avg < 55)
          return ('D');
        else if (avg0 < 40)
          return ('T');
      }
    };
    int main() {
      string firstName;
      string lastName;
      int id;
      int numScores;
      cin >> firstName >> lastName >> id >> numScores;
      vector < int > scores;
      for (int i = 0; i < numScores; i++) {
        int tmpScore;
        cin >> tmpScore;
        scores.push_back(tmpScore);
      }
      Student * s = new Student(firstName, lastName, id, scores);
      s - > printPerson();
      cout << "Grade: " << s - > calculate() << "\n";
      return 0;
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-29 18:45:01

Person类没有默认构造函数,因此必须使用Person类型的子对象的参数在内存初始化器列表中Student类的构造函数中显式调用该构造函数。

构造函数可以采用如下方式

代码语言:javascript
运行
AI代码解释
复制
Student( const std::string &firstName, 
         const std::string &lastName, 
         int identification, 
         const std::vector<int> &scores ) 
         : Person( firstName, lastName, identification ), testScores( scores )
{
} 

成员函数可以定义如下

代码语言:javascript
运行
AI代码解释
复制
  char calculate() const
  {
    long long int sum = 0;

    for ( const auto &item : testScores )
    {
        sum += item;
    }

    long long int avg = testScores.size() == 0 ? 0 : sum / testScores.size();

    char c;

    if ( avg >= 90 )
      c = 'O';
    else if ( avg >= 80 )
      c = 'E';
    else if ( avg >= 70 )
      c ='A';
    else if ( avg >= 55 )
      c = 'P';
    else if ( avg >= 40 )
      c = 'D';
    else
      c = 'T';

    return c;
  }

至于你的代码,例如下面的循环

代码语言:javascript
运行
AI代码解释
复制
    for (int i = 0; i < & scores.size(); i++)
      this - > testScores.pushback( & scores[i]);

是无效的,因此不应进行编译,至少因为您正在尝试获取由成员函数size返回的右值的地址。

票数 0
EN

Stack Overflow用户

发布于 2020-04-29 18:56:06

我认为很明显,你期望你的Student对象是一个给定名字的人,但是在你的代码中,你在哪里提到了这一点呢?未使用firstNamelastNameidentitfication参数。下面是你应该怎么做

代码语言:javascript
运行
AI代码解释
复制
Student(string firstName, string lastName, int identification, vector < int > & scores) : 
    Person(firstName, lastName, identification) {
    ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61509068

复制
相关文章
C++中类中同时存在继承以及组合时候,构造函数的构造顺序
C++的一大特点就是面向对象,面向对象主要就是类的一些相关特性(封装、继承、多态)。
全栈程序员站长
2022/07/11
1.2K0
成员以其在类中声明的顺序构造
分析以下代码的输出: #include<iostream> using namespace std; class A { public: A(int j):age(j) , num(age + 1) { cout<<"age:"<<age<<",num:"<<num<<endl; } protected: int num; int age; }; void main() { A sa(15); }  运行结果:age:15 , num:2(num为一个随机数) 由于按成员在类定义中的声明
猿人谷
2018/01/17
1.5K0
C++ 构造函数的运用,继承、派生时的重载方式
c++在进行实例化的时候通常需要使用构造函数,没有显示构造函数的时候,系统会默认一个所有参数为空的默认构造函数。
雪碧君
2023/02/15
7360
【C++】继承 ⑦ ( 继承中的对象模型分析 | 继承中的构造函数和析构函数 )
上述 继承 的过程中 , 每一层继承 , 都继承了上一级 父类的 成员变量 , 同时自己也定义了新的成员变量 ;
韩曙亮
2023/10/23
2880
【C++】继承 ⑦ ( 继承中的对象模型分析 | 继承中的构造函数和析构函数 )
【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )
继承关系 : C 类 继承了 B 类 class C : public B , B 类 继承了 A 类 class B : public A ;
韩曙亮
2023/10/25
2470
【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )
c++类的构造函数不显式声明会自动生成吗
本篇文章讲解c++11中,类的构造函数种类,以及不显式声明的情况下是否会自动生成。
cpp加油站
2021/05/14
1.2K0
C++:39---继承中构造函数、析构函数的关系
一、继承中构造函数的关系 如果父类没有构造函数,则子类初始化时不需要构造父类 如果父类有构造函数,则子类初始化自己的构造函数时,要先初始化父类的构造函数 基类的构造函数必须在派生类的构造函数初始化列表来进行初始化 总结:在构造自己(子类)之前,需要先构造父类 演示案例 例如:下面的父类A有构造函数,则子类B在初始化构造函数时,必须要构造父类A class A //父类 { int a_data; public: A(int data) { a_data = data; } ~A() {}//5 }; cla
用户3479834
2021/02/03
1.1K0
Python中的类在声明的时候继承object的原因
首先说明python3中无论写不写(object),默认的会自动带上,所以在python3中写不写都一样 class Student1: pass class Student2(object): pass print(dir(Student1())) print(dir(Student2())) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '
知识浅谈
2020/06/16
1.4K0
C++中类的构造函数和析构函数
构造函数 对象创建的时候执行 student s //空参构造函数 栈内存中 student s("测试")//带参构造函数 栈内存中 或者 student *s=new student//空参构造函
乱码三千
2021/07/29
2K0
C++中类的构造函数和析构函数
C++ 类构造函数&解析函数
类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。构造函数 constructor,它通过声明一个与 class 同名的函数来定义。当且仅当要生成一个 class 的新的实例 (instance)的时候,也就是当且仅当声明一个新的对象,或给该 class 的一个对象分配内存的时候,这个构造函数将自动被调用。
嵌入式视觉
2022/09/05
1.6K0
C++ 类构造函数&解析函数
从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
该文讲述了C++面向对象继承多态编程中,有关基类、派生类、继承、虚函数、构造函数、析构函数、友元、拷贝构造函数、赋值运算符、类型转换、基类到派生类的转换等方面的知识。
s1mba
2017/12/28
1.6K0
从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
【Kotlin】Kotlin 类的继承 一 ( 类继承基本方式 | final 关键字 | 子类主构造函数 | 子类次构造函数 )
0 . 类继承格式 : 使用 " : " 继承父类 ; 如果该父类有主构造函数 , 那么子类必须至少有一个主构造函数或次构造函数 , 子类的构造函数下面会根据不同情况详细解析 ;
韩曙亮
2023/03/27
1.4K0
【Kotlin】Kotlin 类的继承 一 ( 类继承基本方式 | final 关键字 | 子类主构造函数 | 子类次构造函数 )
python的子类继承父类构造函数说明
如果在子类中需要父类的构造方法就需要显式地调用父类的构造方法,或者不重写父类的构造方法。
狼啸风云
2019/09/18
2.9K0
C++类的构造函数与析构函数
C++中每个类都有其构造与析构函数,它们负责对象的创建和对象的清理和回收,即使我们不写这两个,编译器也会默认为我们提供这些构造函数。下面仍然是通过反汇编的方式来说明C++中构造和析构函数是如何工作的。
Masimaro
2018/08/31
1.6K0
c++ 继承类强制转换时的虚函数表工作原理
本文通过简单例子说明子类之间发生强制转换时虚函数如何调用,旨在对c++继承中的虚函数表的作用机制有更深入的理解。
xiaoxi666
2018/10/29
1.2K0
JavaScript构造函数的继承
使用 call 或 apply 方法,将父对象的构造函数绑定在子对象上,即在子对象构造函数中加一行:
Leophen
2019/08/23
9900
java构造函数方法声明无效_如何构造函数
Java构造函数,也叫构造方法,是JAVA中一种特殊的函数。与函数名相同,无返回值。
全栈程序员站长
2022/10/05
1.7K0
C++构造函数 | 构造函数
C++在建立一个对象时,常常需要作某些初始化,如果一个数据成员未被赋值,则它的值是不可预知的,因为在系统为它分配内存时,保留了这些存储单元的原状,这就成为了这些数据成员的初始值,在C++中,对象是一个实体,它反映了客观事物的属性,是应该有确定的值的。
小林C语言
2021/01/26
2.2K0
C++构造函数 | 构造函数
c++类的声明
就像函数的声明与定义分离一样,我们也可以仅声明类而暂时不定义类: 1 class ClassName;//ClassName类的声明 这种声明有时被称作前向声明 对于一个类来说,我们创建它的对象之前该类必须被定义过,而不能仅仅被声明。否则编译器将无法了解这样的对象需要多少的存储空间。类似的,类也必须首先被定义,然后才能用引用或者指针访问其成员。毕竟,如果类尚未定义,编译器也不清楚该类到底有哪些成员。 作用:   它向程序中引入名字ClassName并且指明ClassName是一种类类型。 注意:   对于类
拾点阳光
2018/05/10
9940
js中构造函数和普通函数的区别_函数声明和函数定义
b.构造函数的调用方式:需要使用new关键字来调用 new Person();
全栈程序员站长
2022/10/04
3.2K0
js中构造函数和普通函数的区别_函数声明和函数定义

相似问题

在C++中尝试使用构造函数从类继承时出错

11

继承c++,创建构造函数时出错

10

继承类c++中的构造函数

31

c++继承: C2614调用基类的构造函数时出错

30

如何为继承的类声明构造函数?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档