在Qt(或者C++)中,有没有办法得到一个类的变量的名字?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Qt(或者C++)中,有没有办法得到一个类的变量的名字?相关的知识,希望对你有一定的参考价值。

比如说有这样一个类:
class A
int year;
int month;
int day;

有没有办法可以知道A里面是否有个变量的名字叫year?

这是C++啊大哥,怎么都整成这样了!如果是在编译的时候,你有源代码的话这个就可以直接找了!如果是在运行时判断,应该就没办法了,因为C++编译器会把改名字改成另一个它在内存中的符号,并以该符号来标识这个变量,除非你知道编译器是怎么编译的,否则应该就不太可能了! 参考技术A java里面可以实现,因为java是解释型语言。c++的话,编译之后肯定无法作此判断。预编译和编译阶段的话,又没什么意思。 参考技术B while not eof do

A=A.year .next
if A.year = "year"
then exit

追问

貌似不能编译通过啊,在while not eof do那里。

参考技术C 直接调用的时候判断一下不就行了,如果调用成功就有啊! 一个if语句就行了吧!

Qt / C++:有没有办法自动注册元类型?

【中文标题】Qt / C++:有没有办法自动注册元类型?【英文标题】:Qt / C++: Is there a way to automatically register meta types? 【发布时间】:2018-03-29 19:48:59 【问题描述】:

为了获得 Qt 元类型系统的所有功能,我必须在应用程序初始化期间在运行时调用 qRegisterMetaType。具体来说,我需要注册:

我的每个QObject 派生类的指针类型,即qRegisterMetaType<MyClass *>(),以及 我使用Q_DECLARE_METATYPE 声明为元类型的每种类型。

目前,我使用一个函数来执行此操作,该函数只为每个我手动维护和更新的函数调用 qRegisterMetaType

然而,这对我来说相当不方便且容易出错。我经常健忘,忘记注册元类型不会产生任何编译错误,但是当我的代码尝试使用元类型系统并且由于我忘记注册其中之一而失败时,它会导致运行时错误。有时错误可能难以追踪。

那么有什么方法可以让我的所有QObject 派生类和声明的元类型自动注册?

一些可能会影响解决方案的因素:

我需要注册的所有 QObject 派生类也都派生自我自己的单个基类,因此我可以使用它来实现每个其他类都将继承的功能。 如有必要,我愿意使用神秘的编译器技术!

【问题讨论】:

与未连接的信号/插槽相同。当 qRegisterMetaType 未声明但需要时,您将收到警告。在您发布应用程序之前,您需要检查您的日志/调试输出。我认为没有什么好方法可以自动执行此操作。 在调试版本中,我过滤 Qt 消息并在警告上设置断点。这样,如果 Qt 有我知道的警告。 检查这是否有帮助 Q_DECLARE_METATYPE for template class 这有点棘手。您需要创建自己的工厂来注册函数,这些函数将在运行时调用qRegisterMetaType。这应该用于每个 exe/dll 实例。它可以用一些全局容器来完成,但是因为在 C++ 中没有定义初始化变量的顺序——它可能不是微不足道的。可能,我很快就会给你一个例子 【参考方案1】:

我想不出一种自动声明元类型的方法,即不在类头中提供Q_DECLARE_METATYPE宏,但可以提供一个自动执行注册的宏(或多或少与元类型声明一起)。此示例旨在声明和 只注册给定类的指针类型:

#include <QMetaType>

#define METAID(CLASS)                \
    Q_DECLARE_METATYPE(CLASS*)       \
    static struct CLASS##Metaid      \
                                    \
      CLASS##Metaid()                \
                                    \
        qRegisterMetaType<CLASS*>(); \
                                    \
     _CLASS##metaid;

上面的宏可以代替Q_DECLARE_METATYPE

class MyClass : public QObject

Q_OBJECT
;

METAID(MyClass)

【讨论】:

没有理由将基于 OObject 的类注册为元类型。它可能只对指针有用。 另一个问题:复制 ctor 在 QObject 中是私有的 - 所以在子类中制作 ctor 没有意义。 是的@DmitrySazonov,但 OP 说他们必须注册 QObject 派生类......或者我误解了? 对 OP 来说这是个好问题。我能想象的只有一种情况——将指向基于 QObject 的实例的指针保存到QVariant 中。据我了解 - OP 需要为每次使用 Q_DECLARE_METATYPE 自动调用 qRegisterMetaType 如果 CLASS 是不可复制的类型,这是非常错误的。我不确定它是否可以编译,或者如果没有 - 如果它链接。如果是这样,那就是等待发生的运行时错误。我也不确定在QCoreApplication 实例化之前调用qRegisterMetaType 是否有效。至少需要检查一下。最后,CLASSMetaid 实例将在包含该标题的每个翻译单元中创建 - 毕竟它们是 static。有点浪费。

以上是关于在Qt(或者C++)中,有没有办法得到一个类的变量的名字?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 QObject 中的属性更改时得到通知?

从 Qt C++ 中的另一个应用程序获取文本字段的值

Qt C++: 怎样在两个MainWindow或者Widget之间交换数据

C++ 中有没有办法将给定类的函数限制为仅另一个类(不使用继承,朋友)?

C++ 中,类的实例化对象是指啥?如果确保它的实例化对象只得一个?

C++:有没有办法在不暴露其他私有成员的情况下限制对某些类的某些方法的访问?