构造函数调用的约束

时间:2018-05-16 15:17:21

标签: c++ qt

我设计了一个类InputField,其中包含一个带有2个参数的构造函数:explicit InputField(InputFieldIndex uiIndex, QString sName) noexcept;

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

2 个答案:

答案 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