c++ - C++ 构造函数和类?
问题描述
我是 C++ 新手,我正在尝试学习如何使用构造函数和类。我的代码通过结构在 C 中正确运行,但是当我尝试在 C++ 中实现类时,我得到了错误,我不知道从哪里来。
该代码是为了让我输入一个数字等级和一个字母,例如 100 F。作为回报,它应该告诉我第一个值的字母等级,以及字母的数值:100:A 和 45:F。我确信这些功能是正确的,我主要是有道理的。我得到的错误说G级没有匹配功能;在我的主要。
class Grade {
public:
int* percent;
char* letter;
char GRADE_MAP [11] = {'F', 'F', 'F', 'F', 'F', 'F', 'D', 'C', 'B', 'A', 'A'};
Grade(int p, char l){
percent = new int;
letter = new char;
*percent = p;
*letter = l;
}
~Grade(){
delete percent;
delete letter;
}
void setByPercent(int p){
p = *percent;
*letter = GRADE_MAP[p / 10];
}
void setByLetter(char l){
l = *letter;
*percent = 100 - (l - 'A') * 10 - 5;
}
void print(){
printf("Grade: %d: %c \n", *percent, *letter);
}
};
int main() {
int percent;
Grade g;
printf("Enter two grades separated by a space. Use a percentage for the first and letter for the second: \n");
scanf("%d", &percent);
scanf("\n");
g.setByPercent(percent);
g.print();
g.setByLetter(getchar());
g.print();
return 0;
}
解决方案
好的,首先要做的事情是:您完全滥用了动态内存。动态分配单个int 或单个 char 没有意义。指针至少是 int 的大小,如果不是大小的两倍(取决于 CPU 和 OS 的组合),对于 char 来说,它是大小的 4 或 8 倍。加上间接成本。
此外,通过将其GRADE_MAP
定义为常规的、已初始化的类成员,您将为每个实例创建一个副本。
最后但并非最不重要的一点是,访问说明符的全部目的是将类成员从外界手中拉走(在某种程度上,您仍然可以通过做记忆巫术来操纵它们)。
所以让我们摆脱它。
首先包括 iostream 和 sstream 用于输出
#include <sstream>
#include <iostream>
class Grade {
只是普通会员,没有动态
int percent;
char letter;
makestatic
和 const 把它移到可执行文件.rodata
部分
static char const GRADE_MAP [11] = {'F', 'F', 'F', 'F', 'F', 'F', 'D', 'C', 'B', 'A', 'A'};
用于转换的静态辅助函数,由 setter 和构造函数使用:
static int fromLetter(char l){
int p = 100 - (l - 'A') * 10 - 5;
if( 0 > p || 100 < p ){
throw std::range_error("equivalent percentage out of range");
}
return p;
}
static char fromPercent(int p){
if( 0 > p || 100 < p ){
throw std::range_error("percentage out of range");
}
return GRADE_MAP[p / 10];
}
构造函数应该是公开的
public:
在此处使用初始化程序
Grade(int p)
: percent(p)
, letter( fromPercent(p) )
{}
Grade(char l)
: percent( fromLetter(l) )
, letter( l )
{}
~Grade(){}
您可能打算从 p 访问百分比。您编写它的方式忽略了参数
void setByPercent(int p){ percent = p; letter = fromPercentage(p); } void setByLetter(char l){ letter = l; percent = fromLetter(l); }
最后是 C++ -ish 并使用 iostream
basic_ostringstream strstr(){
basic_ostringstream os;
os << "Grade: " << percent << ": " << letter;
return os;
}
}; int main() { int percent, letter;
std::cout << "Enter two grades separated by a space. Use a percentage for the first and letter for the second:" << std::endl;
std::cin >> percent >> letter;
Grade g1(percent)
Grade g2(letter)
std::cout << g1.strstr() << "; " << g2.strstr() << std::endl;
return 0; }
推荐阅读
- excel - 从一个工作簿复制工作表并粘贴到另一个工作簿
- angular - 使用 amcharts4 编译 Angular 8 CLI 项目时出现问题
- r - 用 VCF 文件中的 DNA 字母替换数字基因型代码
- spring - spring cloud gateway exception Illegal character in authority at index error
- node.js - 忽略文件夹内的白名单文件夹
- bash - 循环浏览术语列表和批量重命名文件
- laravel - 如何从两个表中获取匹配的数据?
- python - 从多个 JSON 文件构造 DataFrame
- typescript - 如何使用多态性来隐藏接口的属性?
- python - pip 安装 math3d - 错误