gpt4 book ai didi

c++ - 在 Qt 自定义对象中使默认构造函数私有(private)

转载 作者:可可西里 更新时间:2023-11-01 18:37:40 25 4
gpt4 key购买 nike

我正在阅读 this关于自定义类型的 Qt 文档页面,它声明如下:

The default constructor, copy constructor and destructor are all required, and must be public, if the type is to be integrated into the meta-object system.

假设我有一个对象需要使用一些必需的参数来构建,因为使用默认构造函数构建它没有意义,例如:

struct IntPair
{
IntPair(int first, int second);
~IntPair();
};

如文档所述,要使其在 Qt 元对象系统中可用,它需要默认构造函数。但实际上,在没有一对整数的情况下提供构建 IntPair 对象的机会是没有意义的(抱歉这个丑陋的例子)。

有没有办法在不实现默认构造函数的情况下实现这一点?我正在考虑我的对象和 Qt 元对象系统之间的某种友元...

基本上,我无法理解为什么需要默认构造函数。

最佳答案

问题分为两部分:

  1. 在不实现默认构造函数的情况下实现自定义元对象。
  2. 了解为什么在这种情况下 Qt 需要默认构造函数。

其他受访者已经解决了 (2)。

我想解决 (1)。

我写了一个类,我打算让这个类的用户调用我写的一个 ctor,它需要几个参数。但是,由于 Qt 相关的要求,我不得不添加一个零参数构造函数。

至少让零参数 ctor 私有(private)化会让我很高兴,这样我就可以强制所有用户代码 EXCEPT moc 生成的“魔法”代码将被禁止使用该 ctor .

你好,幸福!这是可能的。

您确实可以使用 friendship 将默认的 ctor 设为私有(private)并仍然使用 Qt Metatype。

看起来像这样:

class MyClass {
Q_GADGET

Q_PROPERTY(QString text READ text)

public:
MyClass(QString text, bool sometruth, int someint);

QString text() const { return text_; }

private:
// Works in my project using Qt 5.12. (see hints below if it fails for you)
friend struct QtMetaTypePrivate::QMetaTypeFunctionHelper<MyClass, true>;
// Prefer the ctor that takes arguments. This ctor only exists to satisfy Qt.
MyClass();

QString text_;
};

有两种方法可以解决与什么交 friend 的问题。

您可以将构造函数标记为私有(private),尝试重新编译,并仔细检查编译器错误以找出其他类型正在尝试访问您的类的构造函数。

或者,你可以在你的ctor的body中放置一个assert(false);,创建一个带有调试符号(包括Qt调试符号)的二进制文件,然后查看当断言失败时在调试器的堆栈中。堆栈将显示调用您的构造函数的 Qt 内部成员函数或自由函数。无论来电者是谁,都成为 friend 。

最后一种方法(使用调试器)对我有用。 (我的编译器语言不够流利,无法从巨大的编译器错误输出中辨别出哪种类型是我需要添加的 friend 。)

关于c++ - 在 Qt 自定义对象中使默认构造函数私有(private),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32588253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com