【发布时间】:2016-09-13 22:08:20
【问题描述】:
从下面的代码中,我正在尝试创建一个课程评分系统。因此,它将存储作业的类型、权重和达到的成绩。我试图让它打印原始分数(这是输入的成绩,例如:“B-”或 85.50;取决于它是考试还是测验)。
我已经阅读了有关“强制转换”的信息,它应该可以解决使用void* 作为指针的问题,但我仍然不清楚如何实现它。我试过static_cast<struct Grading*>(c.gs[0])(在代码中注释掉)但它仍然返回值的地址,而不是值本身。任何帮助将不胜感激。提前致谢!
#include <iostream>
#include <vector>
using namespace std;
struct Grading{
string name;
int percentage;
virtual ~Grading(){}
virtual void* get_raw_score(){return 0;}
void* get_adj_score(){return 0;}
};
struct Quiz:public Grading{
string letter_grade;
Quiz(const string title, const int weight, const string grade){
name=title;
percentage=weight;
letter_grade=grade;
}
virtual void* get_raw_score(){return &letter_grade;}
};
struct Exam:public Grading{
double *score = new double;
Exam(const string title, const int weight, const double grade){
name=title;
percentage=weight;
*score=grade;
}
virtual void* get_raw_score(){return &score;}
};
struct Project:public Grading{
string letter_grade;
Project(const string title, const int weight, const string grade){
name=title;
percentage=weight;
letter_grade=grade;
}
virtual void* get_raw_score(){return &letter_grade;}
};
struct CourseWork{
vector<Grading*> gs;
void push_back(Grading* g){
gs.push_back(g);
}
void sort_name(){}
void sort_score(){}
};
ostream& operator<<(ostream& o,const CourseWork c){ //output the raw score here.
//static_cast<struct Grading*>(c.gs[0]);
o<<c.gs[0]->name<<endl<<c.gs[0]->percentage<<c.gs[0]->get_raw_score()<<endl;
return o;
}
int main() {
CourseWork c;
c.push_back(new Quiz("Quiz", 5, "B-"));
c.push_back(new Quiz("Quiz", 5, "C+"));
c.push_back(new Quiz("Quiz", 5, "A"));
c.push_back(new Exam("Midterm", 10, 50));
c.push_back(new Exam("Final", 30, 85.5));
c.push_back(new Project("Project", 5, "A-"));
c.push_back(new Project("Project", 15, "B-"));
c.push_back(new Project("Project", 15, "B-"));
c.push_back(new Project("Demo", 10, "C"));
cout << "** Showing populated data..." << endl;
cout << c << endl << endl;;
c.sort_name();
cout << "** Showing sorted by name..." << endl;
cout << c << endl << endl;
c.sort_score();
cout << "** Showing sorted by score..." << endl;
cout << c << endl;
return 0;
}
【问题讨论】:
-
根据我所做的阅读,这是获得
string或double的唯一方法,因为如果作业是测验,它将是string等级,但如果它是考试,它将是double int。 -
听起来你可能想要
boost::variant -
^ ... 或者只是一个模板化的
Grading基类。 -
@NathanOliver 我不能使用任何外部库。这是一个分级作业,所以我只能使用标准的 c++ 库。
-
这是作业吗?我建议您非常仔细地阅读作业,因为它可能解释了我们想要什么。我怀疑从虚函数返回
void *真的是提倡的解决方案。我建议返回string(并根据需要将数字分数转换为字符串)。
标签: c++ c++11 casting void-pointers