对构造函数调用的约束
Constraint on constructor calling
我设计了一个类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>
。
相关文章:
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 返回指向对象的指针的函数调用是否为 prvalue?
- C++ 如何重载 [] 运算符并进行函数调用
- 代码的效率. 转到和函数调用
- 是同一作用域的函数部分中的函数调用
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 对构造函数调用的约束