C++ 链表在c++;
如何创建包含不同对象类的链表。例如,如果一个人是基类,它将student和teacher作为派生类,那么我如何创建一个链表,该链表可以同时包含student和teacher这两类对象。 下面是我为此编写的源代码,但它不起作用C++ 链表在c++;,c++,oop,C++,Oop,如何创建包含不同对象类的链表。例如,如果一个人是基类,它将student和teacher作为派生类,那么我如何创建一个链表,该链表可以同时包含student和teacher这两类对象。 下面是我为此编写的源代码,但它不起作用 #include<iostream> #include<string> using namespace std; int classNum; class person { public: string name;
#include<iostream>
#include<string>
using namespace std;
int classNum;
class person
{
public:
string name;
public:
person(string="");
void show_p_name();
};
class student:public person
{
public:
string s_name;
int rollnum;
public:
student(string="", string="", int=100);
void show_name();
};
class worker:public person
{
public:
string w_name;
int work_id;
public:
worker(string="", string="", int=200);
void show_name();
};
// person
person::person(string nm)
{
name = nm;
}
void person::show_p_name()
{
cout << "In person class name is: " << name << endl;
}
// student inheriate person
student::student(string nm, string snm, int rolln)
:person(nm)
{
s_name = snm;
rollnum = rolln;
}
void student::show_name()
{
cout << "In student class name is: " << s_name << endl;
}
// worker inheriate person
worker::worker(string nm, string wnm, int wid)
:person(nm)
{
w_name = wnm;
work_id = wid;
}
void worker::show_name()
{
cout << "In worker class name is: " << w_name << endl;
}
// structure declaration
struct Node
{
person *p;
struct Node *next;
};
struct Node* createNode()
{
struct Node *t;
t = new struct Node;
classNum++;
if(t == NULL)
{
cout << "Memory Not Allocated\n";
//exit(0);
}
else
{
return t;
}
}
void initLink(struct Node *n)
{
n->next = NULL; //Make next as NULL
}
void initNode(struct Node *temp)
{
if((classNum % 2) == 0)
{
/*
temp->p = new student;
static_cast<student*>(temp->p)->name = "person_s_sahil";
static_cast<student*>(temp->p)->s_name = "student_sahil";
static_cast<student*>(temp->p)->rollnum = 100;
temp->p = static_cast<student*>(temp->p);
*/
temp->p = new student();
temp->p->name = "person_s_sahil";
temp->p->s_name = "student_sahil";
temp->p->rollnum = 100;
}
else
{
/*
temp->p = new worker;
static_cast<worker*>(temp->p)->name = "person_w_sahil";
static_cast<worker*>(temp->p)->w_name = "worker_sahil";
static_cast<worker*>(temp->p)->work_id = 100;
temp->p = static_cast<worker*>(temp->p);
*/
temp->p = new worker()
temp->p->name = "person_w_sahil";
temp->p->w_name = "worker_sahil";
temp->p->work_id = 100;
}
}
void attachEnd(struct Node **hptr, struct Node *tn)
{
struct Node *cn;
if(*hptr == NULL) //if list is empty
{
*hptr = tn; //attach new node to head
}
else
{
cn = *hptr; //get first node call as currunt node
while(cn->next != NULL) //get last node
{
cn = cn->next;
}
cn->next = tn; //attach new node to next of last node
}
}
void traverse(struct Node *hptr)
{
struct Node *temp;
if(hptr == NULL)
{
cout << "List is empty\n";
}
else
{
temp = hptr;
while(temp != NULL)
{
temp->p->show_name();
temp = temp -> next;
}
}
}
main()
{
struct Node *head = NULL;
struct Node *temp;
temp = createNode();
initLink(temp);
initNode(temp);
attachEnd(&head, temp);
traverse(head);
// like that I want to create node and attach to linked list
}
#包括
#包括
使用名称空间std;
int classNum;
班主任
{
公众:
字符串名;
公众:
人(字符串=”);
void show_p_name();
};
班级学生:公众人士
{
公众:
字符串s_名称;
int-rollnum;
公众:
学生(string=“”,string=“”,int=100);
void show_name();
};
班主任:公众人士
{
公众:
字符串w_名称;
int work_id;
公众:
工作者(字符串=”,字符串=”,int=200);
void show_name();
};
//人
person::person(字符串nm)
{
名称=纳米;
}
void person::show_p_name()
{
cout(p);
*/
临时->p=新学员();
temp->p->name=“person\u s\u sahil”;
temp->p->s_name=“student_sahil”;
temp->p->rollnum=100;
}
其他的
{
/*
临时工->p=新工人;
静态施法(temp->p)->name=“person\u w\u sahil”;
静态(临时->p)->w_name=“worker\u sahil”;
静态铸造(温度->p)->工作id=100;
温度->压力=静态铸造(温度->压力);
*/
临时工->p=新工人()
temp->p->name=“person\u w\u sahil”;
temp->p->w_name=“worker\u sahil”;
温度->压力->工作id=100;
}
}
无效附加(结构节点**hptr,结构节点*tn)
{
结构节点*cn;
if(*hptr==NULL)//如果列表为空
{
*hptr=tn;//将新节点连接到头部
}
其他的
{
cn=*hptr;//获取第一个节点调用作为currunt节点
while(cn->next!=NULL)//获取最后一个节点
{
cn=cn->next;
}
cn->next=tn;//将新节点附加到最后一个节点的下一个
}
}
无效遍历(结构节点*hptr)
{
结构节点*temp;
如果(hptr==NULL)
{
cout p->show_name();
温度=温度->下一步;
}
}
}
main()
{
结构节点*head=NULL;
结构节点*temp;
temp=createNode();
初始链接(临时);
初始化节点(temp);
附件(和封头、温度);
导线(头部);
//像这样,我想创建节点并附加到链表
}
略微固定的代码(为了便于编译):
void initNode(结构节点*temp)
{
如果((classNum%2)==0)
{
/*
临时->p=新学生;
静态施法(temp->p)->name=“person\u s\u sahil”;
静态(temp->p)->s_name=“student\u sahil”;
静态(温度->p)->rollnum=100;
温度->压力=静态铸造(温度->压力);
*/
自动s=新学生();
温度->p=s;
temp->p->name=“person\u s\u sahil”;
s->s_name=“student_sahil”;
s->rollnum=100;
}
其他的
{
/*
临时工->p=新工人;
静态施法(temp->p)->name=“person\u w\u sahil”;
静态(临时->p)->w_name=“worker\u sahil”;
静态铸造(温度->p)->工作id=100;
温度->压力=静态铸造(温度->压力);
*/
自动p=新工人();
温度->p=p;
temp->p->name=“person\u w\u sahil”;
p->w_name=“worker_sahil”;
p->work_id=100;
}
无效遍历(结构节点*hptr)
{
结构节点*temp;
如果(hptr==NULL)
{
cout p->show_p_name();
温度=温度->下一步;
}
}
}
如果您修复了代码,它将起作用(一目了然)。正确的方法是创建指向Person类型对象的指针链接列表。 然后用指向学生和教师类实例的指针填充它。您必须动态创建它(新关键字) 现在,在Person类中使用关键字virtual进行方法声明,这带来了魔力。在googlec++多态性和c++虚拟方法中检查此项 若您在指向Person对象的指针上调用虚方法,它将从派生类调用适当的方法 使用结束时,不要忘记为列表中的每个元素调用
delete
(程序)。为此,您必须在Person类中定义虚拟析构函数
在您的情况下,应该像这样定义Person类
class person
{
public:
string name;
virtual ~person() {};
public:
person(string="");
virtual void show_name();
};
或者另一种方法可以是使用dynamic\u cast()
,但为此,您需要在编译器中启用它。它被称为RTTI(运行时类型信息)。使用dynamic cast,您可以安全地从一个人向学生或教师进行投射。如果动态强制转换无法执行强制转换,它将返回nullptr
。因此,您可以检查此值。但它不工作是什么意思?请解释显示错误的原因,如错误:“类人员”没有名为“s_name”的成员,与w_name、rollnum、work_id和show_name相同使用std::list
并使类具有多态性(至少具有虚拟析构函数)。从“struct Node*next”行中删除struct关键字从任何地方都可以引用结构节点。我可以使用temp->p访问基类和派生类的所有成员吗?temp->p是基类的指针。基类不知道派生类。因此,您可以将基类强制转换为派生类,或者(在您的情况下更好)填充派生类,然后设置为temp->p。此外,如果您希望将不同的函数转换为派生类,这可以从基类中获得-您可以查看“virtual”函数。对于上面的代码,它显示错误:“p”没有命名类型auto p=new student();你可以这样写:student*s=newstudent()代码>,自动是较新的C++的功能,我如何才能访问派生类的所有成员请你向我解释更多detail@sahilmakandar要真正访问派生类对象,您必须执行动态_cast。但我想你不会这么做的。而是从父类调用虚方法。这就是问题所在,调用虚拟方法可以确保正确的方法
class person
{
public:
string name;
virtual ~person() {};
public:
person(string="");
virtual void show_name();
};