【问题标题】:A list containing objects of two different classes in C++包含 C++ 中两个不同类的对象的列表
【发布时间】:2013-06-07 18:55:21
【问题描述】:

我觉得Java比C++更流利,所以我会试着用几句话来解释我想要“传输”什么。在Java 中,您可以创建一个ArrayList,其中包含2 个或更多类的对象,其中一个类继承自另一个类。让我来说明一下。假设我们有:

class Vehicle
{
...
}

class Car extends Vehicle
{
...
}

然后你可以做类似的事情Car a = new Vehicle ([arguments]); 然后您可以将VehicleCar 的对象添加到创建的相同ArrayList 中,如下所示:

ArrayList ar = new ArrayList<Car>();

现在我的问题是,在 C++ 中,我手动编写了代码来创建一个简单的链表。该列表的每个节点描述如下:

struct clientListNode
{
    vip* cust;
    struct clientListNode* next;
};

vip 是另一个派生自customer 的类。有没有办法让我的列表同时接受vip 类和customer 类的对象?

【问题讨论】:

    标签: c++ list object


    【解决方案1】:

    多态以另一种方式工作。您可以使用customer* 指针指向vip 对象,但不能相反。 (这与Liskov-substitution principle有关。)

    因此,如果您的 clientListNode 类中有一个 customer*,它将同时接受 vip*customer* 指针。

    但是,我认为您不应该重新发明轮子并从头开始实施链表。您应该查看 STL(标准模板库),它已经为此类问题提供了解决方案。例如,它已经有一个链表的实现,std::list

    您必须使用您想要使用的基本类型来模板 std::list,但重要的是您不能将类型直接用作值 (std::list&lt;cust&gt;),因为这会物理存储客户实例在内存中,您无法容纳更具体的 vip 类型(会发生切片)。
    相反,您必须使用某种句柄作为模板参数,您可以使用本机指针 (std::list&lt;cust*&gt;),但这样您必须管理内存释放,或者 - 更优选 - 您可以使用智能指针,例如 @ 987654334@ (std::list&lt;std::shared_ptr&lt;cust&gt;&gt;),这样创建的对象会自动销毁。

    【讨论】:

    • 感谢您的评论,但事实上我必须重新发明轮子,这是我的一个项目。不过,这是为了提供建设性的反馈并回答我的问题。
    【解决方案2】:

    我怀疑即使在 java 中你也可以使 Car = new Vehicle,但反过来也有意义。

    您所追求的称为“多态集合”。 C++ 标准库没有开箱即用的库,但您可以使用 shared_ptr&lt;Vehicle&gt;unique_ptr&lt;Vehicle&gt; 的集合来近似它。前者的分叉非常接近于 java 的等价物。

    第三方库可能已经准备好使用多态集合,您可以使用该术语进行搜索。

    【讨论】:

      【解决方案3】:

      如果customer 是基类,那么节点的cust 字段应该是customer* 类型,它会很乐意接受客户和贵宾。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-24
        • 2013-11-09
        • 2022-01-08
        • 1970-01-01
        相关资源
        最近更新 更多