Нужна помощь в понимании синтаксиса классов C ++ - PullRequest
0 голосов
/ 22 октября 2019

Я прошел курс Harvard CS50 и неплохо работал с python. Сейчас я делаю курс C ++ (Microsoft), и в процессе обучения я создаю несколько классов. В этом упражнении мне специально поручено создать несколько объектов в main и вернуть некоторые значения;

#include <iostream>
#include "School.h"

int main()
{
    Student student1("Joe", "Bloggs", 31, "123 Fake Street", "London");
    Student student2("Fred", "Adams", 24, "95 Something Avenue", "Manchester");
    Student student3("John", "Doe", 90, "44a Old Man Lane", "Kettering");

    Course course1("Introduction to Psychology");
    course1.addStudent(student1);
    course1.addStudent(student2);
    course1.addStudent(student3);

    Teacher teacher1("Helen", "Professorson", 48, "15 Teacher Way", "Kent");

    course1.addTeacher(teacher1);

    std::cout << course1.getCourseName() << std::endl;
    teacher1.GradeStudent();
}

Я использую файл заголовка и файл cpp для определения классов School.h:

#pragma once

#include <string>

class Person
{
public:
    // Constructors and Destructors
    Person();
    Person(std::string, std::string);   // First and Last Name
    Person(std::string, std::string, int, std::string, std::string, std::string); // fName, lName, Age, Address, City, Phone
    ~Person();

    // Member functions
    std::string getFirstName();
    void setFirstName(std::string);

    std::string getLastName();
    void setLastName(std::string);

    int getAge();
    void setAge(int);

    std::string getAddress();
    void setAddress(std::string);

    std::string getCity();
    void setCity(std::string);

    std::string getPhone();
    void setPhone(std::string);

private:
    std::string _fName;
    std::string _lName;
    int _age;
    std::string _address;
    std::string _city;
    std::string _phone;

};

class Student : public Person
{
public:
    // Constructors and Destructors


    // Member Functions
    void SitInClass();
};

class Teacher : public Person
{
public:
    // Member Functions
    void SitInClass();
    void GradeStudent();
};

class Course
{
public:
    // Constructors and Desctructors
    Course();
    Course(std::string); // course name
    ~Course();

    // Member functions
    void addStudent(Student);
    void addTeacher(Teacher);

    // Getters and Setters
    std::string getCourseName();
    void setCourseName(std::string);


private:
    // Member variables
    std::string _courseName;
    Student _students[30];
    Teacher _teacher;
};

School.cpp:

#include "School.h"
#include <iostream>
#include <string>

// Constructors
Person::Person()
{
    std::string _fName{};
    std::string _lName{};
    int _age{};
    std::string _address{};
    std::string _city{};
    std::string _phone{};
}

Person::Person(std::string fName, std::string lName)
{
    std::string _fName{ fName };
    std::string _lName{ lName };
    int _age{};
    std::string _address{};
    std::string _city{};
    std::string _phone{};
}

Person::Person(std::string fName, std::string lName, int age, std::string address, std::string city, std::string phone)
{
    std::string _fName{ fName };
    std::string _lName{ lName };
    int _age{ age };
    std::string _address{ address };
    std::string _city{ city };
    std::string _phone{ phone };
}

// Destructor
Person::~Person()
{
}

std::string Person::getFirstName()
{
    return this->_fName;
}

void Person::setFirstName(std::string fName)
{
    this->_fName = fName;
}

std::string Person::getLastName()
{
    return this->_lName;
}

void Person::setLastName(std::string lName)
{
    this->_lName = lName;
}

int Person::getAge()
{
    return this->_age;
}

void Person::setAge(int age)
{
    this->_age = age;
}

std::string Person::getAddress()
{
    return this->_address;
}

void Person::setAddress(std::string address)
{
    this->_address = address;
}

std::string Person::getCity()
{
    return this->_city;
}

void Person::setCity(std::string city)
{
    this->_city = city;
}

std::string Person::getPhone()
{
    return this->_phone;
}

void Person::setPhone(std::string phone)
{
    this->_phone = phone;
}

void Student::SitInClass()
{
    std::cout << "Sitting in main theater" << std::endl;
}

void Teacher::SitInClass()
{
    std::cout << "Sitting at front of class" << std::endl;
}

void Teacher::GradeStudent()
{
    std::cout << "Student Graded" << std::endl;
}

Course::Course()
{
    Student* _students;
    Teacher* _teacher;
    std::string _name{};
}

Course::Course(std::string name)
{
    Student* _students[30];
    Teacher* _teacher;
    std::string _name{ name };
}

Course::~Course()
{
}

void Course::addStudent(Student student)
{
    // TODO: Loop through _students and insert new student in
}

void Course::addTeacher(Teacher teacher)
{
    this->_teacher = &teacher;
}

std::string Course::getCourseName()
{
    return this->_name;
}

void Course::setCourseName(std::string name)
{
    this->_name = name;
}

Меня фактически не учили наследованию, но поскольку ученику и учителю требовались одинаковые переменные (имя, возраст, адрес и т. Д.), Я решил это 'было бы разумно.

Однако возникли некоторые проблемы:

  1. Мои экземпляры Student и Teacher в main.cpp не верны. Я думаю, потому что они наследуют от человека (?). Как создать конструктор в этих производных классах? Я гуглил это, но решения, похоже, не сработали.

  2. Класс Course требует набора студентов. У меня есть , чтобы указать размер массива в заголовочном файле? Кажется глупым, что я указал 30 как в файле заголовка, так и в файле cpp, но VSstudio жалуется, если я этого не сделаю.

  3. Я использую здесь строки. Ранее я узнал из другого курса о char * и памяти о строках. Сколько символов назначено всем этим переменным класса строки? Если я создаю экземпляр ученика с именем «Джо», а затем хочу изменить его имя на «Джозеф», используя student1.SetFirstName, это вызовет ошибки сегментации?

1 Ответ

0 голосов
/ 24 октября 2019

Спасибо, я понял это в основном ...

  1. Мне нужно было создать конструкторы в Student и Teacher с теми же входными переменными, что и в классе Person, а затем вызватьконструктор Person в конструкторе Student:
Student::Student()
{
}

Student::Student(std::string fName, std::string lName)
    : Person(fName, lName)
{
}

Student::Student(std::string fName, std::string lName, int age, std::string address, std::string city, std::string phone)
    : Person(fName, lName, age, address, city, phone)
{
}
Вам не нужно указывать размер массива в конструкторе: заголовочный файл выглядит так:
class Course
{
    ...

private:
    // Member variables
    std::string _name;
    Student* _students[30];
    Teacher* _teacher;
};

И конструктор выглядит так:

Course::Course()
    : _students{ 0 }, _teacher{ 0 }, _name{}
{
}

Комуинициализировать каждый элемент массива до 0.

Не уверен, что все еще ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...