C++ 一个链表(CPP)中的两个不同节点

C++ 一个链表(CPP)中的两个不同节点,c++,linked-list,C++,Linked List,我有一个治疗家长班,还有两个孩子,内部治疗和外部治疗。我需要创建一个包含两个子节点的单链表。我不允许使用模板或内置列表 我面临的问题是nextptr的类型,我找到的唯一解决方案是创建一个基本节点父类型,并将两个子类型放在其中,再加上一个类型变量以了解它是哪种类型的节点。大概是这样的: enum node_type = {inner, outer}; struct treatment_node{ Inner_Treatment t1; Outer_treatment t2;

我有一个治疗家长班,还有两个孩子,内部治疗和外部治疗。我需要创建一个包含两个子节点的单链表。我不允许使用模板或内置列表

我面临的问题是
next
ptr的类型,我找到的唯一解决方案是创建一个基本节点父类型,并将两个子类型放在其中,再加上一个类型变量以了解它是哪种类型的节点。大概是这样的:

enum node_type = {inner, outer};
struct treatment_node{

    Inner_Treatment t1;
    Outer_treatment t2;
    struct treatment_node *next;
    node_type treatment_type;

}

我将根据治疗类型知道访问哪个类。这行得通吗?

正如《变形学》所说,你可以使用与你的问题相同的措辞,但“基”一词的含义不同。因此,您可以创建一个
base
treatment类并从中继承内部和外部类:

class treatment_node {
    treatment_node *next;
public: 
    virtual std::string getTreatment()  = 0;
    ...
};
现在,你的外在和内在:

class Outer_treatment : public treatment_node {
    ... members ...
public:
    std::string getTreatement() override {...}
};


};
class Inner_treatment : public treatment_node {
    ... members ...
public:
    std::string getTreatement() override {...}
};

现在,您可以将这两个节点都放在
Treatment\u节点列表中,您听说过吗?“这行得通吗?”完全取决于您的用例,以及您计划如何创建
internal\u Treatment
Outer\u Treatment
并在处理过程中统一处理它们。@scohe001是的,如果不使用它,我将无法创建列表。但是我看不出它与
next
ptr?的类型有什么关系@MichaelX如果你将
next
类型设为基类指针,那么你就可以得到两个子类对象的混合列表。使用多态性时,即使指针类型相同,它们的行为仍然像不同的类对象。这就是我想要暗示的。Michael,@scohe001建议这样的结构:我已经有了一个治疗父类和两个治疗子类(它们包含int、chars和另一个类)。你是说我应该再做一次治疗吗?我不确定我是否听懂了。如果您对您的示例感兴趣,那么这些类就是您的
treatment\u节点
类是一个容器,其中包含其他类的对象作为成员。这没有多大意义。面向对象编程是基于多形性和继承的概念,我在示例中展示了这一点。
base
类是其他两个类之间的共同点,具有允许差异的能力。您可以创建一个只知道“公共”部分的列表。阅读关于polymorphysm的文章,可以得到更详细的解释。@MichaelX您的治疗类都是从一个公共基础扩展而来的,但是节点(
struct-Inside\u-node{
struct-Outside\u-node{
)不是。一个可能的解决方案是
struct-node{treatment*t;node*next;}现在每个人都使用同一个节点,并且该节点包含一个指向多态对象的指针。是的。这大约是多态点的一半。任何“is-a”(继承自)
Treatment
可以通过
Treatment*
来指出。你不知道它到底是什么,也不需要知道。如果你确实需要知道,你可能应该重新考虑设计,但有时会发生这种情况。在上面的示例中,我在基类中定义了一个
virtual
函数
gettreatment
。它在子类中被重写,可以在子类中执行不同的操作并返回数据。因此,调用
t->gettreatment()
将针对该类的不同实现执行不同的任务并返回不同的数据。如果您对此不满意,您可以将基类强制转换为子类并以这种方式获取数据。