返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >怎么在C++链表中链入不同类型对象
  • 362
分享到

怎么在C++链表中链入不同类型对象

2023-06-17 13:06:21 362人浏览 泡泡鱼
摘要

这篇文章主要介绍“怎么在c++链表中链入不同类型对象”,在日常操作中,相信很多人在怎么在C++链表中链入不同类型对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在C++链表中链入不同类型对象”的疑惑有所

这篇文章主要介绍“怎么在c++链表中链入不同类型对象”,在日常操作中,相信很多人在怎么在C++链表中链入不同类型对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在C++链表中链入不同类型对象”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

达到这个目标的原理其实很简单,只要把不同类型的对象变成同样的类型就可以了。看下面的结构定义:

struct Mobject  {         void *p;         int ObjectType;  };

将一个对象链入链表时,将指向这个对象的指针赋给p,同时记录对象类型。当取得这个节点的时候,根据ObjectType的值来确定p指的对象类型,从而还原指针类型,也就得到了原来的对象。

后面讲到的广义表实际上采用的就是这种方法。显而易见的,这样的Mobject支持的对象是预先确定的,你将自己维护ObjectType列表,每添加一种类型的支持,你需要在ObjectType列表中给出它的替代值,然后在相应的switch(ObjectType)给出这种类型的case语句。很烦人是吧,下面给出另一种方法,其实还是这个原理,不同的是,把这个烦人的工作交给编译器了。

还记得前边强调的原则吗,为什么我们将不同类型的对象放在一个链表中呢?很显然,我们想达到这样的一个效果:比如说,我们在一个链表中储存了三角形,直线,圆等图形的参数,我们希望对某个节点使用Draw()方法,就重绘这个图形;使用Get()则得到这个图形的各个参数;使用Put()则修改图形的参数。可以看出,这些不同的对象实际上有同样的行为,只是实现的方法不同。

C++的多态性正好可以实现我们的构想。关于这方面,请参阅相关的C++书籍(我看的是《C++编程思想》)。请看如下的例子:

#ifndef Shape_H   #define Shape_H   class Shape     {   public:          virtual void Input() = 0;          virtual void Print() = 0;          Shape(){};          virtual ~Shape(){};   };   #endif

【说明】定义一个抽象基类,有两个行为,Input()为输入图形参数,Print()为打印图形参数。图省事,只是简单的说明问题而已。

#ifndef Point_H   #define Point_H   class Point     {   public:          void Put()          {                 cout << "x坐标为:";                 cin >> x;                 cout << "y坐标为:";                 cin >> y;          }          void Get()          {                 cout << endl << "x坐标为:" << x;                 cout << endl << "y坐标为:" << y;          }          virtual ~Point(){};   private:          int x;          int y;   };   #endif

【说明】点的类定义与实现。

#ifndef Circle_H   #define Circle_H   #include "Shape.h"   #include "Point.h"    class Circle : public Shape     {   public:          void Input()          {                 cout << endl << "输入圆的参数";                 cout << endl << "输入圆心点的坐标:" << endl;                 center.Put();                 cout << endl << "输入半径:";                 cin >> radius;          }          void Print()          {                 cout << endl << "圆的参数为";                 cout << endl << "圆心点的坐标:" << endl;                 center.Get();                 cout << endl << "半径:" << radius;          }                virtual ~Circle(){};   private:          int radius;          Point center;   };   #endif

【说明】圆的类定义与实现。继承Shape类的行为。

#ifndef Line_H   #define Line_H   #include "Shape.h"   #include "Point.h"   class Line : public Shape    {   public:          void Input()          {                 cout << endl << "输入直线的参数";                 cout << endl << "输入端点1的坐标:" << endl;                 point1.Put();                 cout << endl << "输入端点2的坐标:" << endl;                 point2.Put();          }          void Print()          {                 cout << endl << "直线的参数为";                 cout << endl << "端点1的坐标:";                 point1.Get();                 cout << endl << "端点2的坐标:";                 point2.Get();          }          virtual ~Line(){};   private:          Point point1;          Point point2;   };   #endif

【说明】直线类的定义与实现。继承Shape的行为。

#ifndef ListTest_H   #define ListTest_H   #include   #include "List.h"   #include "Circle.h"   #include "Line.h"   void ListTest_MObject()   {          List a;          Shape *p1 = new Circle;          Shape *p2 = new Line;          p1->Input();          p2->Input();          a.Insert(p1);          a.Insert(p2);          Shape *p = *a.Next();          p->Print();          delete p;          a.Put(NULL);          p = *a.Next();          p->Print();          delete p;          a.Put(NULL);   }   #endif

【说明】这是测试函数,使用方法是在含有main()的cpp文件头部加入#include “ListTest.h”,然后调用ListTest_Mobject()。这是一个简单的例子,可以看出,删除这样的链表节点需要两个步骤,先delete链表节点data域里指针所指的对象,然后才能删除链表节点。同样,析构这样链表的时候,也需要注意这个问题。不然的话,你的程序运行一次内存就少一点(可能不是这样,据说操作系统在程序中止时可以回收动态内存,但后面的结论是对的),如果是个频繁调用的函数,当运行一段时间后,你的系统就瘫痪了。所以,使用这样的链表***是派生一个新的链表类,实现相应的操作。例如这样:

class ShapeList : public List  {   public:          BOOL SL_Remove()          {                 Shape *p = *Get();                 delete p;                 return Remove();          }  };

到此,关于“怎么在C++链表中链入不同类型对象”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 怎么在C++链表中链入不同类型对象

本文链接: https://lsjlt.com/news/289380.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么在C++链表中链入不同类型对象
    这篇文章主要介绍“怎么在C++链表中链入不同类型对象”,在日常操作中,相信很多人在怎么在C++链表中链入不同类型对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在C++链表中链入不同类型对象”的疑惑有所...
    99+
    2023-06-17
  • C++链表类怎么封装
    这篇文章主要介绍“C++链表类怎么封装”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++链表类怎么封装”文章能帮助大家解决问题。1.CList.h#ifndef CLIST_H#defi...
    99+
    2023-06-30
  • 怎么理解JS原型、原型链、对象
    本篇内容主要讲解“怎么理解JS原型、原型链、对象”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解JS原型、原型链、对象”吧! 一. 普通对象与函...
    99+
    2024-04-02
  • C#怎么使用泛型集合存储不同类型的对象
    在C#中,您可以使用泛型集合来存储不同类型的对象。为此,您可以使用泛型类List或Dictionary<TKey, TValu...
    99+
    2024-04-09
    C#
  • 如何在 ASP 对象中使用不同的数据类型?
    ASP(Active Server Pages)是一种服务端脚本语言,常用于创建动态的网页。在ASP中,我们经常需要使用不同的数据类型来进行数据的存储和处理。本文将介绍如何在ASP对象中使用不同的数据类型。 一、字符串类型 字符串类型是AS...
    99+
    2023-07-29
    对象 数据类型 leetcode
  • C++怎么实现链表插入排序
    本篇内容主要讲解“C++怎么实现链表插入排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么实现链表插入排序”吧!链表插入排序链表的插入排序实现原理很简单,就是一个元素一个元素的从原链表...
    99+
    2023-06-20
  • Javascript中面向对象和原型原型链是怎样的
    今天就跟大家聊聊有关Javascript中面向对象和原型原型链是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。面向对象理论知识总述* 核心答案...
    99+
    2024-04-02
  • Linux中怎么链接文件类型
    今天就跟大家聊聊有关Linux中怎么链接文件类型,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。硬链接硬链接只能引用同一文件系统中的文件。它引用的是文件在文件系统中的物理索引(也称为 ...
    99+
    2023-06-16
  • 如何在Python中处理不同类型的HTTP对象加载?
    在Python中,HTTP对象加载是一项非常重要的任务,因为它涉及到了从Web服务器获取数据和资源。不同类型的HTTP对象加载需要不同的方法和技术,因此,本文将为您介绍如何在Python中处理不同类型的HTTP对象加载。 第一部分:HTTP...
    99+
    2023-09-28
    load http 对象
  • 如何在 LeetCode 中使用 ASP 对象的不同数据类型?
    LeetCode 是一个非常受欢迎的面试准备平台,它提供了许多算法和数据结构的练习题目,以帮助开发人员提高自己的编程技能。在 LeetCode 上使用不同的数据类型是非常常见的,本文将介绍如何使用 ASP 对象中的不同数据类型。 ASP 对...
    99+
    2023-07-29
    对象 数据类型 leetcode
  • 在CSS中不同类型的列表项怎么标记
    今天小编给大家分享一下在CSS中不同类型的列表项怎么标记的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2024-04-02
  • C++中怎么实现链表操作
    C++中怎么实现链表操作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C++链表操作代码示例:// linklist.cpp : 定义控制台应用程...
    99+
    2023-06-17
  • C语言中单链表怎么用
    这篇文章将为大家详细讲解有关C语言中单链表怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、单链表概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序...
    99+
    2023-06-29
  • c语言怎么将链表中数据存入文件
    在C语言中,可以使用文件操作相关的函数来将链表中的数据存入文件中。下面是一个简单的示例代码:c#include #include /...
    99+
    2023-10-18
    c语言
  • 前端开发中面对对象与原型原型链是什么意思
    这篇文章主要为大家展示了“前端开发中面对对象与原型原型链是什么意思”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“前端开发中面对对象与原型原型链是什么意思”这篇文章吧。一、面向对象:面向对象是一种...
    99+
    2023-06-05
  • 怎么在ASP.NET中对不同类型的用户进行限流
    本文章向大家介绍怎么在ASP.NET中对不同类型的用户进行限流,主要包括{**}的使用实例,应用技巧,基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。1、安装Nuget包已经发布到nuget.org,有多种安装方式...
    99+
    2023-06-06
  • HTML在有序列表中不同类型的列表项怎么标记
    本篇内容介绍了“HTML在有序列表中不同类型的列表项怎么标记”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2024-04-02
  • 怎么在java中对对象的类型进行转换
    怎么在java中对对象的类型进行转换?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。对象类型转换分为向上转型和向下转型(强制对象转型)。 向上转型是子对象向父对象转型的过程,例如...
    99+
    2023-05-30
    java
  • c语言怎么创建链表并输入数据
    要创建链表并输入数据,可以按照以下步骤进行:1. 首先定义一个节点结构体,包含一个数据域和一个指向下一个节点的指针域。例如:```c...
    99+
    2023-08-25
    c语言
  • 怎么在Oracle中创建区块链表
    这篇文章给大家介绍怎么在Oracle中创建区块链表,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。创建区块链表使用 CREATE BLOCKCHAIN TABLE 命令创建区块链表,同时可以指定三个选项。其中,NO DR...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作