我是C ++的新手,我正在尝试学习如何使用构造函数和类。我通过结构在C中正确运行了代码,但是当我尝试在C ++中实现类时,出现错误,我不知道从哪里来。
该代码是为我输入数字等级和字母,例如作为回报,它应该告诉我第一个值的字母等级,以及字母的数值: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;
}
对于初学者,这两个成员函数无效
void setByPercent(int p){
p = *percent;
*letter = GRADE_MAP[p / 10];
}
void setByLetter(char l){
l = *letter;
*percent = 100 - (l - 'A') * 10 - 5;
}
似乎是您的意思
void setByPercent(int p){
*percent = p;
*letter = GRADE_MAP[p / 10];
}
和
void setByLetter(char l){
*letter = l;
*percent = 100 - (l - 'A') * 10 - 5;
}
该类没有默认的构造函数。所以这个声明
Grade g;
是不正确的,因为此处将调用缺少的默认构造函数。
例如为创建的对象指定自变量,例如
Grade g( 100, 'A' );
好的,首先要考虑的是:您完全滥用了动态内存。动态分配single int或单个char没有意义。指针的大小至少为int的大小,如果不是大小的两倍(取决于CPU和OS的组合),则为char的大小是大小的4或8倍。加上间接费用。
还通过将GRADE_MAP
定义为常规的初始化类成员,您还为每个实例创建了一个副本。
最后但并非最不重要的一点,访问说明符的全部要点是使类成员远离外界的手(在某种程度上,您仍可以通过记忆伏都教来操纵它们)。
所以让我们摆脱它。
首先包含iostream和sstream进行输出
#include <sstream>
#include <
class Grade {
只是普通成员,没有动态
int percent;
char letter;
使static
和const将其移到可执行文件.rodata
部分中>
static char const GRADE_MAP [11] = {'F', 'F', 'F', 'F', 'F', 'F', 'D', 'C', 'B', 'A', 'A'};
用于转换的静态帮助器函数,由设置方法和构造方法使用:
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; }