将结构转换为类并使用构造函数、突变器和访问器
Convert a Struct to Class and use Constructors, Mutators and Accessors
我有一个问题,我正在努力解决。我得到了一个struct
:
struct Module
{
string moduleName;
string moduleCode;
string lecturer;
string nrStudents;
}
并要求我执行以下操作:
- 将结构转换为类
- 将所有成员变量设为私有
- 包括以下各项的公共成员函数
- 一个默认构造函数,它将字符串成员变量设置为空白字符串,
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
,另一种方法是设置它,等等。
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 为什么我的突变器函数没有设置任何内容?还是我的构造函数?
- 将结构转换为类并使用构造函数、突变器和访问器