Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链表在c++;_C++_Oop - Fatal编程技术网

C++ 链表在c++;

C++ 链表在c++;,c++,oop,C++,Oop,如何创建包含不同对象类的链表。例如,如果一个人是基类,它将student和teacher作为派生类,那么我如何创建一个链表,该链表可以同时包含student和teacher这两类对象。 下面是我为此编写的源代码,但它不起作用 #include<iostream> #include<string> using namespace std; int classNum; class person { public: string name;

如何创建包含不同对象类的链表。例如,如果一个人是基类,它将student和teacher作为派生类,那么我如何创建一个链表,该链表可以同时包含student和teacher这两类对象。 下面是我为此编写的源代码,但它不起作用

#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();
};