对构造函数调用的约束

Constraint on constructor calling

本文关键字:约束 函数调用      更新时间:2023-10-16

我设计了一个类InputField,它有一个具有 2 个参数的构造函数:explicit InputField(InputFieldIndex uiIndex, QString sName) noexcept;

我将这个类存储在一个QVector中,所以,不幸的是,我必须添加一个默认构造器。就软件设计而言,这对我不利(因为我对uiIndex有限制)。 有没有办法只允许 QT(在我的情况下QVector)调用默认构造函数?宏指令还是预处理器指令?

你可以尝试QVector<InputField>成为朋友类。

考虑以下玩具示例:

class Foo {
// Grant QVector<Foo> access to this class' internals
friend class QVector<Foo>;
public:
explicit Foo(int a, bool b) {
// Empty
}
private:
Foo() {
// Callable by this class and QVector<Foo>.
}
};

这样,就可以将Foo实例存储在QVector<Foo>中:

QVector<Foo> myList;
myList << Foo(1, true) << Foo(2, false);

但是,例如,以下内容会失败:

Foo foo;
QVector

不需要调用默认构造函数; 毕竟,std::vector没有 - 除非您使用需要该构造函数的方法之一。您所需要的只是在QVector中禁用默认构造:

#define QVECTOR_NON_DEFAULT_CONSTRUCTIBLE(Type) 
template <> QVector<Type>::QVector(int) = delete; 
template <> void QVector<Type>::resize(int newSize) { 
Q_ASSERT(newSize <= size()); 
detach(); 
} 
template <> void QVector<Type>::defaultConstruct(Type*, Type*) { Q_ASSERT(false); }

然后,将宏放在放置Q_DECLARE_METATYPE的位置:就在声明类型的位置:

class InputField {
...
};
QVECTOR_NON_DEFAULT_CONSTRUCTIBLE(InputField)

然后,您可以使用具有与std::vector相同的限制的QVector<InputField>