我设计了一个类InputField
,其中包含一个带有2个参数的构造函数:explicit InputField(InputFieldIndex uiIndex, QString sName) noexcept;
我将此类存储在QVector
中,所以,不幸的是,我必须添加一个默认构造函数。在软件设计方面,这对我不利(因为我对uiIndex
有约束)。
有没有办法只允许QT(在我的情况下为QVector
)来调用默认构造函数?宏或预处理器指令?
答案 0 :(得分:5)
您可以尝试将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;
答案 1 :(得分:1)
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)
然后,您可以使用与QVector<InputField>
具有相同限制的std::vector
。