迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

在 C++ 中查找对象类型

作者:迹忆客 最近更新:2023/08/19 浏览次数:

本文讨论在 C++ 中查找对象类型的不同方法。


在 C++ 中查找类对象的类型

与简单变量的数据类型(如 int、bool 等)类似,类对象也有一个类型,即它们所属的类:

#include<iostream>

using namespace std;

class Vehicles
{
    public:
    string make;
    string model;
    string year;
};

int main()
{
    Vehicles car;
}

在上面的例子中,main()中定义的对象car的类型是Vehicles类,因为car是Vehicles的一个对象。

上面的例子非常简单,我们可以轻松识别对象类型。 但是,在更复杂的项目中,特别是在多个类和对象以及多个程序员一起工作的情况下,跟踪对象类型可能会变得非常混乱。

为了防止这个问题,我们可以使用一些方法来确定对象的类型,我们将在下面的示例中详细介绍它们。


使用 typeid().name() 查找 C++ 中类对象的类型

typeid() 是 typeinfo 库中包含的方法。 typeid.().name() 函数接受变量或类对象并以字符串形式返回其类型的名称。

typeid.().name() 函数的使用演示如下:

#include<iostream>
#include<typeinfo>

using namespace std;

class Vehicles
{
    public:
    string make;
    string model;
    string year;
};

class Aircraft
{
    public:
    string make;
    string model;
    string year;
};

int main()
{
    int x;
    float y;
    bool b;

    Vehicles car;
    Aircraft helicopter;

    cout << "The type of the variable x " << " is " << typeid(x).name() << endl;
    cout << "The type of the variable y " << " is " << typeid(y).name() << endl;
    cout << "The type of the variable b " << " is " << typeid(b).name() << endl;
    cout << "The type of the object car " << " is " << typeid(car).name() << endl;
    cout << "The type of the object helicopter " << " is " << typeid(helicopter).name() << endl;
}

上面的代码片段产生以下输出:

The type of the variable x  is i
The type of the variable y  is f
The type of the variable b  is b
The type of the object car  is 8Vehicles
The type of the object helicopter  is 8Aircraft

如上所示,typeid.().name() 函数适用于简单变量和用户定义的类对象。 该函数分别返回 int、float 和 bool 的 i、f 和 b。

该函数返回对象汽车和直升机各自的类名称。 请务必注意,在此示例中,输出类名称前面有一个数字 8,因为类名称和变量名称在 C++ 上下文中的存储方式不同。

当与类目标一起使用时,typeid.().name() 函数依赖于系统和编译器,并且在返回类名时可以在类名之前附加任意字符。 在所使用的系统中,编译器会在类名之前附加类名中的字符数,即,Vehicle 和 Aircraft 的名称中都有 8 个字母。

由于 typeid.().name() 依赖于实现,因此它返回一个损坏的类名,该名称又可以使用 c++filt 命令或 __cxa_demangle 进行拆解。

尽管类名以损坏的形式返回,但它仍然可读并且可用于识别对象的类。 由于返回类型是字符串,因此可以轻松比较对象以检查它们是否具有相同的类。


使用 typeid.().name() 和 __cxa_demangle 查找 C++ 中类对象的类型

如前面的示例所示,使用 typeid.().name() 返回损坏的类名和变量类型。 为了获得分解结果,我们可以使用 cxxabi.h 库中的 __cxa_demangle 函数。

__cxa_demangle 的语法如下:

char *abi::__cxa_demangle(const char *mangled_name, char *output_buffer, size_t *length, int *status)

下面的示例显示了 __cxa_demangletypeid.().name() 的使用:

#include<iostream>
#include<cxxabi.h>

using namespace std;

class Vehicles
{
    public:
    string make;
    string model;
    string year;
};

class Aircraft
{
    public:
    string make;
    string model;
    string year;
};

int main()
{
    int x;
    float y;
    bool b;

    Vehicles car;
    Aircraft helicopter;

    cout << "The type of the variable x " << " is " << abi::__cxa_demangle(typeid(x).name(), nullptr, nullptr, nullptr)  << endl;
    cout << "The type of the variable y " << " is " << abi::__cxa_demangle(typeid(y).name(), nullptr, nullptr, nullptr)  << endl;
    cout << "The type of the variable b " << " is " << abi::__cxa_demangle(typeid(b).name(), nullptr, nullptr, nullptr)  << endl;
    cout << "The type of the object car " << " is " << abi::__cxa_demangle(typeid(car).name(), nullptr, nullptr, nullptr) << endl;
    cout << "The type of the object helicopter " << " is " << abi::__cxa_demangle(typeid(helicopter).name(), nullptr, nullptr, nullptr)  << endl;
}

在此示例的范围内,我们只关心 __cxa_demangle 函数的第一个参数,即损坏的名称。 本案不需要其余的论点。

上面的代码产生以下输出:

The type of the variable x  is int
The type of the variable y  is float
The type of the variable b  is bool
The type of the object car  is Vehicles
The type of the object helicopter  is Aircraft

从输出中可以看出,返回的变量和类型名称已被分解,并且与代码文件中的情况完全相同。

上一篇:在 C++ 中定义和使用负无穷大

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C++ 中定义和使用负无穷大

发布时间:2023/08/19 浏览次数:83 分类:C++

本文讨论了在 C++ 中表示负无穷大的问题并列出了一些可能的解决方案。C++ 使用 IEEE-754 标准来表示浮点数。 浮点数据类型共有三种:float、double 和 long double。

在 C++ 中转换为 SHA256

发布时间:2023/08/19 浏览次数:133 分类:C++

SHA256 转换是一种加密哈希技术,自 90 年代以来一直在使用,但在比特币和区块链出现后获得了重视。它使用一种不可逆的单向哈希技术,这意味着最终答案永远无法逆转回其原始消息,从而使

在 macOS 中编译 C++ 代码

发布时间:2023/08/18 浏览次数:198 分类:C++

本文包含有关 macOS X 的 C++ 编译器的信息。我们将讨论如何使用命令行界面(即终端)使用 g++ 编译器编译和运行代码。

在 Dev C++ 中编译并运行 C++ 11 代码

发布时间:2023/08/18 浏览次数:79 分类:C++

本文是关于使用 Dev C++ 编译 C++ 11 代码。C++ 11 版本 C++ 11是继C++ 3之后的C++新版本,经国际标准组织(ISO)批准于2011年8月12日发布。

C++ 中的清除字符串流

发布时间:2023/08/18 浏览次数:119 分类:C++

本文将介绍在 C++ 中清除或清空字符串流的不同方法。在C++中使用str("")和clear()方法清除字符串流 要清除或清空字符串流,我们可以使用 str("") 和 clear() 方法,但我们必须同时使用这两种方法

在 C++ 中获取文件的 MD5 哈希值

发布时间:2023/08/18 浏览次数:62 分类:C++

MD5 是一种密码协议,以前用于加密,但现在通常用于身份验证。 它基于哈希函数中的哈希过程,针对某些纯文本生成加密的哈希值。什么是哈希函数 在探索 MD5(消息摘要算法)之前,了解哈

将 C# 代码转换为 C++

发布时间:2023/08/18 浏览次数:183 分类:C++

本指南将讨论如何将 C# 代码转换为 C++。将整个语言转换为另一种语言被认为几乎是不可能的。 在这种情况下,C# 到 C++ 代码适用于 Unix,但 .NET Framework 无法从 Unix 上的 C++ 获得。

在 C++ 中使用 extern C

发布时间:2023/08/18 浏览次数:140 分类:C++

本文讨论 C++ 中的名称重整,这是理解 C++ 中 extern "C" 影响的先决条件。 此外,它还介绍了 C++ 编程中的 extern“C”。C++ 中 extern "C" 的使用 我们使用extern关键字来定义全局变量,也称为外部变量

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便