不同classes的链表,如何用指针访问特定的class函数?
Linked list of different classes, how to access specific class functions with pointer?
好的,我有一个人员链接列表。但是,我可以将人员、雇员、教员或学生添加到列表中,因为其他 3 个是 child classes。
教师指导:"Add a sub menu item and related functions (insert book) to allow a new book to be added into the book tree of an existing student node. The new book must be inserted into the correct place to maintain the binary search tree feature. The information of student name, book title, and url must be entered. To simply the program, you can assume that all the nodes in the linked list are Student nodes."
^^ ** 我想指出,我看到她在哪里说要简化假设所有链表都是学生节点,但是 Personnel/Employee/Faculty 和链表的所有代码都在任务。所以,我能想到的 "use" 的唯一方法是遍历所有代码,将任何从 Personnel 到 Student 的引用更改,但在那个时候这似乎是一个相当愚蠢的任务...
所以我的问题是:我需要遍历链接列表,直到我仅使用名称字段找到正确的条目。但随后我需要编辑与该条目相关联的 BookTree class,只有 child class Student 拥有。由于与 Personnel 的类型不匹配,我无法使用 Student 指针遍历链表(尽管该列表除了学生之外没有任何其他内容),但是如果我使用 Personnel 指针找到它,我当然会赢'有权访问学生特定的功能来编辑我需要的内容。
我试过 Student *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
的指针来控制其他实体(子实体)。现在您正在做相反的事情,编译器告诉您右侧 (a Personnel*
) 无法转换为 Student*
。那是因为隐式地向下转换是不可能的。通常,Derived
是 Base
,因此您可以从 Derived*
隐式转换为 Base*
(向上转换),但不能反过来。
参见例如this tutorial 有关 up/down 铸造的更多信息。
EDIT 如果您知道 Personel*
指针指向 Student
,那么您可以使用 dynamic_cast<Student*>(your_pointer)
访问 Student
对象的特征。但是,转换通常是设计不完美的标志,您应该尽量避免。特别是,您如何知道列表中对象的动态类型是什么(假设您得到的列表已经被其他函数填充)?您可以使用 RTTI(测试 typeid
结果然后 dynamic_cast
-ing),但它不仅痛苦而且不真正推荐。最好实现一个通用的虚接口,让编译器在运行时处理选择正确的虚函数。
好的,我有一个人员链接列表。但是,我可以将人员、雇员、教员或学生添加到列表中,因为其他 3 个是 child classes。
教师指导:"Add a sub menu item and related functions (insert book) to allow a new book to be added into the book tree of an existing student node. The new book must be inserted into the correct place to maintain the binary search tree feature. The information of student name, book title, and url must be entered. To simply the program, you can assume that all the nodes in the linked list are Student nodes."
^^ ** 我想指出,我看到她在哪里说要简化假设所有链表都是学生节点,但是 Personnel/Employee/Faculty 和链表的所有代码都在任务。所以,我能想到的 "use" 的唯一方法是遍历所有代码,将任何从 Personnel 到 Student 的引用更改,但在那个时候这似乎是一个相当愚蠢的任务...
所以我的问题是:我需要遍历链接列表,直到我仅使用名称字段找到正确的条目。但随后我需要编辑与该条目相关联的 BookTree class,只有 child class Student 拥有。由于与 Personnel 的类型不匹配,我无法使用 Student 指针遍历链表(尽管该列表除了学生之外没有任何其他内容),但是如果我使用 Personnel 指针找到它,我当然会赢'有权访问学生特定的功能来编辑我需要的内容。
我试过 Student *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
的指针来控制其他实体(子实体)。现在您正在做相反的事情,编译器告诉您右侧 (a Personnel*
) 无法转换为 Student*
。那是因为隐式地向下转换是不可能的。通常,Derived
是 Base
,因此您可以从 Derived*
隐式转换为 Base*
(向上转换),但不能反过来。
参见例如this tutorial 有关 up/down 铸造的更多信息。
EDIT 如果您知道 Personel*
指针指向 Student
,那么您可以使用 dynamic_cast<Student*>(your_pointer)
访问 Student
对象的特征。但是,转换通常是设计不完美的标志,您应该尽量避免。特别是,您如何知道列表中对象的动态类型是什么(假设您得到的列表已经被其他函数填充)?您可以使用 RTTI(测试 typeid
结果然后 dynamic_cast
-ing),但它不仅痛苦而且不真正推荐。最好实现一个通用的虚接口,让编译器在运行时处理选择正确的虚函数。