2

我正在尝试将 QVector 与名为 RoutineItem 的自定义对象一起使用。

但是给出了这个错误:

C:\Qt\5.2.1\mingw48_32\include\QtCore\qvector.h:265: error: no matching function for call to 'RoutineItem::RoutineItem()'

这是 RoutineItem 构造函数:

RoutineItem(QString Name,int Position,int Time,bool hasCountdown = false,bool fastNext = false);

如果我删除所有构造函数参数,我将不再收到该错误。如何将 QVector 与具有参数的自定义对象一起使用?

4

3 回答 3

7

问题是 QVector 要求元素具有默认构造函数(即有关的错误消息)。您可以在课堂上定义一个。例如:

class RoutineItem {
    RoutineItem(QString Name, int Position,
                int Time, bool hasCountdown = false,
                bool fastNext = false);
    RoutineItem();
    [..]
};

或者,您可以让所有参数都有一个默认值:

class RoutineItem {
    RoutineItem(QString Name = QString(), int Position = 0,
                int Time = 0, bool hasCountdown = false,
                bool fastNext = false);
    [..]
};

或者,您可以构造 RoutineItem 的默认值并通过它初始化所有向量项:

RoutineItem item("Item", 0, 0);
// Create a vector of 10 elements and initialize them with `item` value
QVector<RoutineItem> vector(10, item);
于 2014-06-19T11:32:45.717 回答
2

在QVector 构造函数中提供非默认参数

示例:以下创建 10 个RoutineItem具有相同Name, Position,的元素Time

QVector<RoutineItem> foo(10, RoutineItem("name", 123, 100 ));
                                            ^     ^     ^
                                            |     |     |
                                            +-----+-----+-----Provide arguments
于 2014-06-19T11:33:12.640 回答
2

如果您愿意使用 C++11 和std::vector,则不再需要默认可构造性:

void test()
{
   class C {
   public:
      explicit C(int) {}
   };

   std::vector<C> v;
   v.push_back(C(1));
   v.push_back(C(2));
}

此代码不适用于 C++11 之前的版本,并且不适用于QVector.

于 2014-06-19T20:20:32.213 回答