好吧,我有一个链接的人员列表。但是,我可以将人员,雇员,教职员工或学生添加到列表中,因为其他3个是儿童课。
教师指示:"添加一个子菜单项和相关功能(插入书),以允许将新书添加到现有学生节点的书中。必须将新书插入正确的位置以维护二进制搜索树功能。必须输入学生名称,书名和URL的信息。要简单地,您可以假设链接列表中的所有节点都是学生节点。"
^^ **我想指出,我看到她说的要简化的位置假定所有链接列表都是学生节点,但是所有人员/员工/教职员工和链接列表的所有代码都在作业中提供。因此,我能想到的"使用"的唯一方法是遍历所有代码,从人员到学生的任何参考的任何更改,但这似乎是一个相当愚蠢的任务...
所以我的问题是:我需要浏览链接列表,直到仅使用名称字段找到正确的条目为止。但是后来我需要编辑与该条目相关的Booktree课,只有儿童课。由于类型不匹配,我无法使用学生指针循环浏览链接列表(尽管列表除了学生以外的其他任何内容),但是如果我通过使用人员指针I找到它,当然,请赢可以访问学生特定的功能来编辑我需要的内容。
我尝试了学生 *ptr =& personnelPtr只是在找到正确的骰子之后将其分配给地址。
代码:
int add_book()
{
char studentName[50]; // blah
PersonnelNode *temp, *prev;
Student *student;
temp = head;
prev = temp;
while (temp != NULL)
{
student = temp->getNode(); // this line gives "value of type Personnel* cannot be assigned to an entity of type Student*
if (_stricmp(studentName, student->getName()) != 0)
{
prev = temp; // loop through
temp = temp->getNext();
index++;
}
else
{
// Do Stuff
// More importantly in the do stuff part I need access to Student-specific data/functions that Personnel pointer won't see
您应该使用Personnel
指针来控制其他实体(儿童)。现在,您正在采取另一种方式,编译器告诉您右手(Personnel*
)无法转换为Student*
。那是因为不可能隐含降低。通常,Derived
是Base
,因此您可以从Derived*
转换为Base*
(向上),但不能以相反的方式转换。
参见例如本教程以获取有关上/下铸造的更多信息。
编辑如果您知道Personel*
指示指向Student
,则可以使用dynamic_cast<Student*>(your_pointer)
访问对象的Student
功能。但是,演员通常是设计不完美的标志,您应该尝试避免使用它们。特别是,您如何知道列表中对象的动态类型是什么(假设您获得了其他功能填写的列表)?您可以使用RTTI(测试typeid
结果,然后是dynamic_cast
-ing),但是它不仅仅是痛苦,而且不建议。实现一个常见的虚拟界面并让编译器在运行时选择正确的虚拟函数要好得多。