将结构转换为类并使用构造函数、突变器和访问器

Convert a Struct to Class and use Constructors, Mutators and Accessors

本文关键字:构造函数 突变 访问 转换 结构      更新时间:2023-10-16

我有一个问题,我正在努力解决。我得到了一个struct

struct Module
{   
    string moduleName;
    string moduleCode;
    string lecturer;
    string nrStudents;
}

并要求我执行以下操作:

  1. 将结构转换为类
  2. 将所有成员变量设为私有
  3. 包括以下各项的公共成员函数
    • 一个默认构造函数,它将字符串成员变量设置为空白字符串,int设置为 0
    • 将字符串成员变量设置为特定值的重载构造函数。
    • 成员
    • 函数,将每个成员变量设置为作为函数参数给出的值,即突变器。
    • 成员
    • 函数,用于从每个成员变量(即访问器(检索数据。

在实例化类 Module 对象的程序中测试类(即"声明"类型"模块的对象(。然后,程序应输入对象的值(从键盘获取(,并使用突变器为成员变量赋值。使用访问器获取对象成员变量的值,并在屏幕上显示这些值。使用以下输入测试程序:
Input for member variables of Module object:

这是我到目前为止的代码:

模块名称:编程
简介模块代码:CSS1515
讲师:史密斯
夫人学生人数:250

#include <iostream>
#include <cstdlib>
using namespace std;
class module
{
 private:
    string moduleNameVar;
    string moduleCodeVar;
    string lecturerVar;
    int nrStudentsVar;
public:
    module( );
    //initializes moduleName, moduleCode and lecturer to a blank string
    //initializes nrStudent to 0
    module(string moduleName, string moduleCode, string lecturer, int nrStudents);
    //initializes moduleName, moduleCode and lecturer to a string value
    //initializes nrStudent to a number of students
    void set(string moduleName, string moduleCode, string lecturer, int nrStudents);
    //sets the moduleName, moduleCode, lecturer and nrStudents
};
int main()
{
    module exam1("Introduction to Programming","COS1515","Mrs Smith", 250);
}
    module::module( ) : moduleNameVar(""), moduleCodeVar(""), lecturerVar(""),     nrStudentsVar(0)
{
    //body intentionally empty
}
    module::module(string moduleName, string moduleCode, string lecturer, int nrStudents)
{
    module::set();
}
    void module::set(string moduleName, string moduleCode, string lecturer, int nrStudents)
{
    moduleNameVar = moduleName;
    moduleCodeVar = moduleCode;
    lecturerVar = lecturer;
    nrStudentsVar = nrStudents;
}

现在我试图理解的是,当我已经定义了一个可以有效地设置我的成员变量的构造函数时,为什么要求我使用突变器。尽管如此,我正在尝试使用:module::set();来实现这一点,但这会在编译器中引发错误:no function for call to module::set()

我在这里错过了什么?如何创建突变器函数和构造函数?

注意:访问器函数似乎很简单,因为我只会使用 get() 函数来访问成员变量?

如何创建突变器函数和构造函数?

非常简单,您只需添加一个公共成员函数,该函数采用 appopriate 类型的参数,并将变量设置为其值。例如,模块名称的突变器应如下所示:

void setModuleName(const string &name){ 
  moduleNameVar = name; 
}

然后为其他人提供类似的功能。

访问器将只从类中返回成员变量的值。例如:

std::string getModuleName() const{ return moduleNameVar; }

以及其他的类似功能。函数声明末尾的"const"表示使用此函数不会更改类中任何内容的值(这不是绝对必要的,但最好包含(。

尽管如此,我正在尝试使用

module::set();

但这在编译器中抛出了一个错误"没有函数可以调用'模块::SET(('

您尚未定义与您尝试使用的函数匹配的函数。您只定义了

module::set(string moduleName, string moduleCode, string lecturer, int nrStudents) 

它有四个参数,并且没有这些参数中的任何一个默认值。但是你试图在没有任何参数的情况下使用它 - 编译器无法知道在这种情况下你想要它做什么,所以它给出了错误。

通常,

当您想要提供一个构造函数来设置对象的字段时,您不会直接使用 setter,而是在初始值设定项列表中初始化它们,就像您对空构造函数所做的那样(除非您有一些不想复制的副作用或计算(。

在您的情况下,您声明了一个 module::set 方法,该方法接受所有参数来设置module的值,但您调用它时不会将这些值从构造函数转发到 set 方法。实际上,该类不存在set(void)方法,这引发了编译错误。

然后阅读规范:

成员函数,

用于将每个成员变量设置为作为函数参数的值,即突变器

这意味着您需要一种方法来初始化它们中的每一个,例如

void module::setName(const std::string& name) {
  this->name = name;
}
const std::string& getName() const {
  return this->name;
}

你应该为每个成员变量编写一个突变器,而不是为所有变量编写一个突变器,例如:

void setName(const string &name)
{
  moduleNameVar = name;
}
即使您有构造函数,突变器

也很有用的原因是,您可以随时使用突变器,而不仅仅是在构造对象时。

首先将重载构造函数的主体替换为module::set()函数体:

module::module(string moduleName, string moduleCode, string lecturer, int nrStudents)
{
    moduleNameVar = moduleName;
    moduleCodeVar = moduleCode;
    lecturerVar = lecturer;
    nrStudentsVar = nrStudents;
}

并删除module::set()方法声明和定义。

接下来,为每个字段添加"getter"和"setter"方法。因此,一种方法可以获取moduleName,另一种方法是设置它,等等。