将Struct转换为Class并使用Constructors,Mutators和Accessors

时间:2015-09-19 13:37:19

标签: c++

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

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

我被要求做以下事情:

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

    在实例化类Module的对象的程序中测试该类(即'声明''类型'模块的对象)。然后程序应该输入对象的值(从键盘获得),并使用mutator为成员变量赋值。使用访问器获取对象的成员变量的值,并在屏幕上显示这些值。使用以下输入测试您的程序:
      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;
}

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

我在这里缺少什么?我如何创建mutator函数以及构造函数?

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

4 个答案:

答案 0 :(得分:1)

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

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

然后阅读规范:

  

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

这意味着您需要一种方法来对每个方法进行初始化,例如

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

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

答案 1 :(得分:1)

  

如何创建mutator函数以及构造函数?

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

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

然后是其他人的类似功能。

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

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

和其他人的类似功能。函数声明末尾的'const'表示使用这个函数不会改变你的类中任何东西的值(这不是绝对必要的,但是包含的是好的做法)。

  

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

来实现这一目标
module::set();
     

但这会在编译器中抛出一个错误“没有函数来调用'module :: set()'

您尚未定义与您尝试使用的功能相匹配的功能。你只定义了

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

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

答案 2 :(得分:0)

您应该为每个成员变量编写一个mutator,而不是为 all 编写一个,例如:

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

即使你有一个构造函数,mutators也很有用的原因是你可以随时使用mutators,而不仅仅是在构造对象时。

答案 3 :(得分:0)

首先用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,另一种方法可以设置它等等。