自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

冯Jungle的个人博客

你清澈又神秘,在贝加尔湖畔

  • 博客(156)
  • 资源 (10)
  • 问答 (2)
  • 收藏
  • 关注

原创 浅析C++类的内存布局

之前Jungle写过一篇文章《探究C++:虚函数表究竟怎么回事?》,主要xiang

2021-06-11 23:24:55 753 4

原创 C++设计模式系列文章汇总

Jungle整理的C++设计模式系列文章出炉了,每一种设计模式都包含:理论知识:每一种模式的定义、解释 模式UML结构和角色分析:UML类图说明模式的角色和结构 模式应用实例:将设计模式应用于具体的例子,并给出UML实例类图 完整的源代码:完整的代码和运行结果示意图,源代码资源及UML图可在Git上下载 总结:每一种模式的特点和适用环境设计模式准备工作设计模式(一)——设计...

2019-11-12 22:12:35 7549 4

原创 机器人位姿描述与坐标变换

机器人的位姿描述与坐标变换是进行工业机器人运动学和动力学分析的基础。本节简要介绍上述内容,明确位姿描述和坐标变换的关系,用到的基本数学知识就是——矩阵。1.位姿表示位姿代表位置和姿态。任何一个刚体在空间坐标系(OXYZ)中可以用位置和姿态来精确、唯一表示其位置状态。位置:x、y、z坐标 姿态:刚体与OX轴的夹角rx、与OY轴的夹角ry、与OZ轴的夹角rz假设基坐标系为OXYZ,刚体...

2018-11-18 11:05:57 22520 12

原创 Qt实现客户端与服务器消息发送与文件传输

客户端与服务器之间的数据传送在很多案例场景里都会有应用。这里Jungle用Qt来简单设计实现一个场景,即: ①两端:服务器QtServer和客户端QtClient ②功能:服务端连接客户端,两者能够互相发送消息,传送文件,并且显示文件传送进度。 环境:VS2008+Qt4.8.6+Qt设计师1.基本概念客户端与服务器的基本概念不说了,关于TCP通信的三次握手等等,在经典教材谢希仁...

2018-05-01 13:06:53 37394 123

原创 C++11—关于引用Reference

C++11推出了右值和右值引用。那么什么是引用,什么是左值引用和右值引用呢?

2022-08-13 16:50:57 838 1

原创 啊,如何遵循“低耦合”设计原则?

1. 引言类的设计需要遵循“高内聚、低耦合”的设计原则(或者说“高内聚、松耦合”)。在之前的文章里介绍过什么是高内聚和低耦合(设计模式(三)——面向对象设计原则)高内聚:内聚是对软件系统中元素职责相关性和集中度的度量。如果元素具有高度相关的职责,除了这些职责内的任务,没有其它过多的工作,那么该元素就具有高内聚性;反之则成为低内聚性。低耦合:耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据某种程度上理解,高内聚低耦合

2022-02-27 11:46:06 903 1

原创 隐藏实现又解耦,认识认识PImpl模式

1. PImpl模式简介PImpl,Pointer to Implementation,指向实现的指针。这是C++中一种常用的模式。严格说来,局限于指针形式,PImpl并不是一种设计模式。PImpl通过一个私有的成员指针,将指针指向的类的内部实现全部隐藏。如下图所示:其中,头文件中需要对PImpl作前向声明,并保存一个私有的PImpl指针。在构造函数中初始化这个指针,在析构函数中释放该指针。当然,也可以使用智能指针。在类A对外暴露的接口的实现中,比如A::getName()...

2022-02-26 16:07:21 1193

原创 【C++】CRTP:奇异递归模板模式

1. 什么是CRTP?什么是CRTP?CRTP的全称是Curiously Recurring Template Pattern,即奇异递归模板模式,简称CRTP。CRTP是一种特殊的模板技术和使用方式,是C++模板编程中的一种惯用法。CRTP的特性表现为:基类是一个模板类 派生类继承该基类时,将派生类自身作为模板参数传递给基类典型代码如下:// 基类是模板类template <typename T>class Base{public: virtual ...

2022-02-26 12:11:47 4895 1

原创 Qt中的设计模式

Qt中有很多设计模式的身影。本文简单介绍3种,分别是单例模式、观察者模式和适配器模式。单例模式如下代码,通过宏aApp返回instance。可以看到,类QCoreApplication的构造函数是private。#define qApp QCoreApplication::instance()class Q_CORE_EXPORT QCoreApplication#ifndef QT_NO_QOBJECT : public QObject#endif{#ifndef Q..

2021-10-24 19:04:28 6214

原创 new也可以创建对象,为什么需要工厂模式?

设计模式里,工厂模式是一类创建型的设计模式。为遵循软件设计和开发的开闭原则,先后衍生出了简单工厂模式,工厂方法模式和抽象工厂模式。在这几篇文章里分别用UML图和实例展示了各种工厂模式的特点和适用场景。再不学简单工厂模式,就真的要去工厂搬砖啦!https://blog.csdn.net/sinat_21107433/article/details/102598181不知道工厂方法模式?你可能真的应该去工厂!https://blog.csdn.net/sinat_21107433/article/det

2021-10-16 11:44:50 2147

原创 划重点:面试中单例模式的考点!(C++版本)

在Jungle的上一篇文章《设计模式那么多!面试官会怎么问》中,总结了在面试过程中经常考察的设计模式及相关考点。文中提到,单例模式几乎是必考点。这并不是危言耸听或者夸大其词。面试中“设计模式三剑客”(单例模式、工厂模式和观察者模式)里单例模式首当其冲!(用词不当?)设计模式那么多!面试官会怎么问?https://blog.csdn.net/sinat_21107433/article/details/1205573731. 单例模式的概念单例模式:确保一个类只有一个实例,并提供一个全局访问点.

2021-10-06 08:45:00 1491

原创 设计模式那么多!面试官会怎么问?

Jungle花了几个月的时间整理出了《C++设计模式系列》,将源码放到了Github上,并且自从这一系列博客发布至今,陆续在修复bug、完善代码和说明文档。当然,文章还存在很多不足,Jungle也将持续完善。C++设计模式系列文章汇总_冯Jungle的个人博客-CSDN博客Jungle整理的C++设计模式系列文章出炉了,每一种设计模式都包含:理论知识:每一种模式的定义、解释模式UML结构和角色分析:UML类图说明模式的角色和结构模式应用实例:将设计模式应用于具体的例子,并给出UML实例类图完整的源代码...

2021-09-29 23:40:30 2091

原创 仿真机器人控制器代码开源啦!

之前用Qt做了个简单的Demo,用VS2008+Qt4.8.6+Coin3D开发环境,以埃夫特ER3A-C60机器人模型为例,开发了一个仿真机器人控制器。之前有写过两篇文章介绍: Qt设计机器人仿真控制器 Qt设计机器人仿真控制器——按键控制机器人关节转动 在知乎上传了示例视频: Qt实现机器人仿真控制器 Qt设计机器人仿真控制器——按键控制机器人关节转动 最近作者将该项目代码开源了,放到了Github上,地址:https://github.com/FengJun

2021-04-03 17:41:12 1953

原创 探究C++:虚函数表究竟怎么回事?

封装,继承和多态,是C++的三大特性。提到多态,就会提到虚函数virtual;提到虚函数,不得不说虚函数表。我们知道,在一个类Class中,如果有定义虚函数,那么这个类对象所占用的存储空间中,会保存一个指向虚函数表的指针,结果是这个类的大小会增加4,即一个指针的大小。那么这个指针存储在类的什么地方?虚函数表里是如何存放各个虚函数的?在具有继承关系的不同类中,虚函数表中的存储有什么变化?本文Jungle将对此做个测试。1.有无虚函数,对类大小的影响前文已经说到,如果一个类定义了虚函数,sizeof

2020-09-12 21:55:25 1837

原创 每天都刷朋友圈,那你知道并查集吗?

微信大概是我们每天必须接触的一个APP之一,公交上、地铁上,异或工作休息时,我们都忍不住刷刷朋友圈,看看一些点赞之交的朋友当天又经历了什么。相较于QQ,微信的一个特点之一就是:除非好友的好友也是你的好友,否则你在朋友圈里看不到好友的好友对好友朋友圈的点赞和评论。今天刷LeetCode,发现了一道名为“朋友圈”的题目:不过题目的要求和微信朋友圈不一样。题目说明,如果A和B是朋友,B和C是...

2020-05-04 00:01:09 675 3

原创 Windows驱动开发环境搭建:VS2013+WDK8.1

尽管网上已经有很多帖子在介绍如何搭建Windows驱动开发环境,Jungle照着这些帖子仍旧折腾了很长时间。在终于搭建成功后记录下环境搭建过程,方便大家使用。1.安装包准备Visio Studio2013:https://pan.baidu.com/s/1P77yeSKuE7mWllcpVUKtrQ提取码:sbavWDK8.1:https://www.microsoft.co...

2020-03-15 19:12:21 2924

原创 资深同事教我做人:堆上分配的内存,只free就完事儿了?

malloc要和free成对使用,malloc的内存,free就完事儿了吗?最近的工作是和另一位资深同事一起,修复组里新老项目上可能存在的一些安全漏洞,包括参数检查和内存释放。参数检查倒还ok,在每个函数开始出对入口参数判空。这一点老代码做得很好,所以这部分工作量很小。关键是内存的释放。new之后,delete了吗?malloc之后,free了吗?准确说,是及时释放堆上动态分配的...

2020-03-15 10:48:25 568

原创 [LeetCode]区间型动态规划题目解析

动态规划适用于有重叠子问题和最优子结构性质的问题。给定一个问题,如果可以将其划分为子问题,并解出其子问题,再根据子问题的解推导/递推以得出原问题的解。LeetCode上关于动态规划的题目众多,除了前述文章的最小路径、股票买卖等问题,区间型动态规划也是一类经典题目。本节将分析LeetCode上两道区间型动态规划题目。关于动态规划:[LeetCode]动态规划及LeetCode题解分析 [L...

2020-02-23 11:10:22 1244

原创 Qt实现设备管理器——枚举系统所有设备

本文Jungle将用vs2013+Qt5.6.0来实现设备管理器。什么是设备管理器?使用过Windows系统的人应该不陌生,它用来管理计算机上的设备。可以使用“设备管理器”查看和更改设备属性、更新设备驱动、配置设备和卸载设备,如下图:外观上来说,设备管理器提供计算机上所安装硬件的图形视图。所以本节Jungle要设计的设备管理器也只是实现这样一个能够显示计算机上所安装硬件的视图软件。1...

2020-02-21 22:13:11 4316 7

原创 赶快拿走!你期待的USB2.0协议中文版出炉啦!

得到

2020-02-15 20:03:09 3776

原创 [LeetCode]动态规划求解博弈问题

博弈论是有趣又有用的知识,可以用来预测在特定的规则下,人们会做出怎样的行为,又会导致怎样的结果。利用博弈论来指导人们的行事法则甚至商业操作,比如著名的囚徒困境就被很好的利用在了商业竞争上。同样,LeetCode也利用博弈论出了几道有意思的题目。如何解这些博弈类的算法题目呢?如果透过题目表面,理清题目的本质,那么题目可能就是一道数学题。当然了,也可以用正儿八经的算法来求解。本文Jungle将使用...

2020-02-08 12:08:47 2019

原创 Git学习资料整理及常见问题总结

回顾Jungle写硕士论文时,虽不至于“披阅十载,增删五次”,但也费心思修改了很多次。每修改一次都得把之前的复制备份保存,下图是部分修改版本的截图。如果修改20次,那么本地计算机里就得保存20个版本的论文!不但占据本地空间,而且要查找某一次修改点时及其不方便。软件代码也是一样,如何管理日渐庞大的软件项目,Git和Github就是重要的版本控制和管理工具。1.Git和Github1.1....

2020-02-03 17:15:39 868

原创 [LeetCode]动态规划,一招团灭最小路径问题

动态规划是求解“最小路径”的常用方法之一,LeetCode上关于“最小路径”的题目如下:64.最小路径和:https://leetcode-cn.com/problems/minimum-path-sum/ 120.三角形最小路径和:https://leetcode-cn.com/problems/triangle/ 931.下降路径最小和:https://leetcode-cn.com/...

2020-01-18 22:47:03 746

原创 [LeetCode]动态规划,一举歼灭“股票买卖的最佳时机“问题!

LeetCode上关于股票买卖的最佳时机一共有6到题目:在[LeetCode]买卖股票的最佳时机ⅠⅡ中,Jungle采用波峰波谷法解决了两道简单题。那么剩余4到题目该如何求解呢?其实对比6到题目,题目要求都大同小异,具体差别在于限制股票交易次数kLeetCode买卖股票的最佳时机题目对比 题目 限制交易次数k 特殊要求 121.买卖股票的最佳时机 k=1 ...

2020-01-12 10:36:20 670

原创 [LeetCode]买卖股票的最佳时机ⅠⅡ

2020年元旦后,股市小涨了一波,Jungle趁此机会,开始思考LeetCode上的股票买卖时机的问题。LeetCode上,关于股票时机买卖一共有6道题目:其中,简单题、中等题、困难题各三道。121. 买卖股票的最佳时机https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/给定一个数组,它的第...

2020-01-07 22:59:07 497

原创 [LeetCode]动态规划之打家劫舍ⅠⅡⅢ

在文章[LeetCode]动态规划及LeetCode题解分析中,Jungle介绍到求解动态规划类问题,一般分为三个步骤:明确数组元素代表的含义 寻找递推关系,务必考虑特殊情况下的递推关系 数组初始化当然,很多文章里把数组每个元素叫做一种“状态”,把相邻数组元素之间的递推关系叫做“状态转移方程”,数组初始化叫做“初始状态”。文章[LeetCode]动态规划LeetCode[简单]题全解...

2020-01-04 11:21:12 530

原创 [LeetCode]动态规划LeetCode[简单]题全解

在文章[LeetCode]动态规划及LeetCode题解分析中,Jungle介绍到求解动态规划类问题,一般分为三个步骤,这里做个简单回顾:动态规划是利用子问题的解推导出原问题的解,即用之前问题的解推导出之后问题的解,即利用已有的解(历史保存的解)来解未知的问题。我们一般使用数组(有一维的,更常用的是二维数组)来保存已有的解(历史记录)。动态规划解题包括三大步骤:(1)明确数组元素代表的...

2020-01-01 21:24:47 903 1

原创 [LeetCode]动态规划及LeetCode题解分析

动态规划(DP,Dynamic programming)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。给定一个问题,如果可以将其划分为子问题,并解出其子问题,再根据子问题的解推导/递推以得出原问题的解。上述描述也许使得动态规划听起来像递归,但动态规划往往用于优化递归问题,例如斐波那契数...

2019-12-29 21:06:25 750 2

原创 Windows网络编程:Winsock实现UDP通信

在文章Windows网络编程:一文深入理解Winsock里Jungle详细介绍了Winsock的头文件、面向连接的通信(TCP/IP)和无连接的通信(UDP/IP),Windows网络编程:Winsock实现客户端与服务器文件传输(TCP/IP)中Jungle基于Winsock实现了面向连接的通信,即利用TCP/IP协议通信。本文,Jungle将展示利用UDP/IP实现发送端与接收端的通信。1...

2019-12-14 11:49:24 3108

原创 Windows网络编程:一文深入理解Winsock

Winsock是一种标准API,主要用于网络中的数据通信,允许两个或者多个应用程序(或进程)在同一机器上或通过网络相互通信。使用Winsock API,应用程序可以通过TCP/IP或UDP协议建立网络通信。Winsock API包括Winsock1和Winsock2版本,Winsock2版本的函数通过前缀"WSA-"标识。比如,建立套接字的Winsock1函数称为socket,而在Winsoc...

2019-12-13 08:41:21 3284

原创 BIOS基本概念

1.BIOS基本概念BIOS(Basic Input/Outut System),基本输入输出系统,保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。BIOS固化在只读存储器(ROM)中,为电脑提供最低级、最直接的硬件控制的程序,是连通软件程序和硬件设备之间的枢纽。也就是说,BIOS是硬件和软件程序之间的一个转换器或接口,负责解决硬件的即时要求,并按照软件对...

2019-12-02 10:05:59 4409

原创 计算机网络——域名系统

在命令行里敲入ping www.baidu.com,下面的提示会显示39.156.66.14这个IP地址(显然,这是一个A类地址)。同样,输入ping www.google.com,同样会显示一个IP地址。这是什么意思呢?再做一个小测试,在C:\Windows\System32\drivers\etc文件夹下,有一个文件hosts。Jungle用notepad打开这个文件,有如下内容:...

2019-11-24 10:50:17 2497

原创 计算机网络——TCP的三次握手和四次挥手

TCP是面向连接的协议(计算机网络——运输层),每一个运输连接包括连接建立、数据传送和连接释放。运输连接的管理就是使运输连接的建立和释放都能正常进行。TCP连接采用的是CS模式,主动发起的连接的应用进程叫客户(Client),被动等待连接的应用进程叫服务器(Server)。在TCP连接建立过程中需要解决以下三个问题:(1)要使每一方能够通知对方的存在;(2)要允许双方协商一些参数(如最大窗...

2019-11-23 11:02:53 589

原创 计算机网络——运输层

一、运输层概述运输层向上面的应用层提供通信服务,是面向通信部分的最高层,也是用户功能中的最底层。“两个主机之间的通信”这种说法并不准确,因为真正进行通信的实体是在主机中的进程。一个主机中可能有多个进程与另一个主机中的多个应用进程通信。所以,从运输层的角度来看,通信的真正端点并不是主机,而是主机中的进程。即端到端的通信是应用进程之间的通信。每一台主机都有一个IP地址(至少一个),因此网络层为主机...

2019-11-22 22:15:18 1288

原创 计算机网络——物理层

在计算机网络体系中个,物理层考虑的是如何连接(各种计算机的传输媒体上传输的)比特流。所以,双绞线、同轴电缆等具体的传输媒介,并不是物理层的含义。计算机网络中的硬件设备和传输媒体的种类繁多,通信手段方式各异,物理层的作用,是要屏蔽掉上述差异,使物理层上面的数据链路层感觉不到这种差异(数据链路层只需考虑如何完成本层的协议和服务,而不必考虑网络具体的传输设备和媒介)。一、数据通信系统1.数据通信...

2019-11-19 22:48:23 446

原创 C++设计实现日志系统

日志系统几乎是每一个实际的软件项目从开发、测试到交付,再到后期的维护过程中极为重要的查看软件代码运行流程、还原错误现场、记录运行错误位置及上下文等的重要依据。一个高性能的日志系统,能够准确记录重要的变量信息,同时又没有冗余的打印导致日志文件记录无效的数据。本文Jungle将用C++设计实现一个日志系统。1.为什么需要日志为什么需要日志?其实在引言中已经提到了,实际的软件项目的几乎每个过...

2019-11-17 11:06:58 6021 3

原创 访问者模式,从双十一购物开始说起

欧耶!这周Jungle的作业终于做完了!作业是什么呢?就是完成一个习题册。Jungle做完之后,得让家长检查习题册并签字;第二天交到学校,组长得初步检查作业是否做完、家长是否签字,然后老师会评阅作业是否正确,并给出评分。就是这么一个习题册,这是经了多少人的手啊! Jungle——完成习题册上的题; Jungle家长——检查儿子的作业,并在习...

2019-11-10 22:57:49 3573 5

原创 不知不觉就在使用的一种设计模式——模板方法模式

类的继承你一定用过,派生类覆写基类的方法你也一定用过,只是你可能不知道,这就是传说中的一种设计模式……1.模板方法模式简介模板方法模式是较简单且常用的一种设计模式,是基于类的继承的一种代码复用技术,其结构只存在基类和派生类之间的继承关系。模板方法是一个具体的方法,给出了一个顶层逻辑流程框架。模板方法模式:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。模板方法模式使...

2019-11-10 10:48:34 3563 9

原创 如何管理和维护算法族?只需知道策略模式

同样是排序算法,你可以选择冒泡排序、选择排序、插入排序、快速排序等等,也即是说,为了实现排序这一个目的,有很多种算法可以选择。这些不同的排序算法构成了一个算法族,你可以在需要的时候,根据需求或者条件限制(内存、复杂度等)适时选择具体的算法。在面向对象的设计里,该如何设计这样一个算法族呢?它包含了多种算法,在使用的时候又会根据条件来选择具体的算法?这就会用到软件设计模式中的——策略模式。...

2019-11-09 21:23:22 4195 1

原创 状态模式——从斗地主开始说起

“人有悲欢离合,月有阴晴圆缺”。很多事物在特定条件下转换成不同的状态,在不同状态下表现出不同的行为。在软件系统中,有些对象在不同的条件下也具有不同的状态,不同状态之间可以相互转换。通过判断不同的条件分支(if...else...或者switch..case...)可以进行状态的转换。但这样势必使得代码的判断逻辑变得复杂,降低系统的可维护性。如果新加入一种状态,还需要修改判断逻辑,不符合...

2019-11-09 10:40:05 3636 4

Qt5+Coin3D仿真6轴工业机器人视频教程

1. 简介:Qt5+Coin3D实现简易版本的6自由度工业机器人建模仿真软件,鼠标拖动6个按钮可以分别控制6个轴转动。 2. 教程分为8个视频,每个视频长度不超过10分钟,基本涵盖介绍背景、Coin3D基础知识、Qt软件界面设计、工业机器人基础知识和参考文章,以及最后的编码实现。

2022-03-02

Qt实现客户端与服务器消息发送与文件传输

客户端与服务器之间的数据传送在很多案例场景里都会有应用。这里Jungle用Qt来简单设计实现一个场景,即: ①两端:服务器QtServer和客户端QtClient ②功能:服务端连接客户端,两者能够互相发送消息,传送文件,并且显示文件传送进度。 环境:VS2008+Qt4.8.6+Qt设计师

2018-12-03

C语言实现通讯录

C语言实现的通讯录,采用链表实现,具有浏览、增加联系人、删除联系人、修改联系人信息、清空通讯录等功能。

2018-07-22

OpenInventor实现索引线集管理

- 通过界面输入三维坐标(x,y,z),添加到轨迹列表和场景中 - 鼠标选择列表里的某条轨迹,可以在场景里高亮显示该路径 - 通过轨迹列表可以删除轨迹

2018-05-22

Qt图片浏览器

用Qt来设计一个图片浏览器,实现以下功能: ①浏览电脑里的文件夹,将当前文件夹下的图片列表罗列出来; ②鼠标点击列表上的某一张图片,图片将显示出来; ③可以控制浏览当前图片的上一张和下一张; ④实现自动播放的开始和停止控制。

2018-05-05

Qt-C++实现文件浏览器

用Qt来实现这么一个文件浏览器,实现以下功能: 1.可以显示指定目录下的文件列表; 2.鼠标双击文件列表里的文件夹,可以进入其子文件夹,也可返回上一级。

2018-04-29

C语言--成绩管理系统

C语言实现的学生成绩管理系统,插入、修改、删除学生各个课程的成绩,打印成绩单,查询成绩排名等功能。

2017-12-29

Coin3D+Qt+C++碰撞检测

环境:Qt4.8.6+VS2008+Coin3D3.1.3 语言:C++ 功能:检测两个物体之间的碰撞并打印出来;用户通过按钮可以控制是否进行检测。

2017-12-28

C实现任意阶矩阵求逆矩阵

C语言实现任意阶数的矩阵求逆矩阵运算,将结果输出到控制台。 在该程序中,将参与运算的矩阵的阶数用变量n代替。对于不同阶数的矩阵的运算,修改该n变量即可。

2017-12-14

OpenInventor实现模型拖动

OpenInventor和C++开发,实现了在三维场景里,鼠标拖动模型并可以进行旋转等操作。

2017-12-14

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除