2014-06-19 73 views
0

我試圖用一個名爲RoutineItem的自定義對象來使用QVector。帶有具有參數的自定義對象的QVector?

不過如果給出這樣的錯誤:

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與具有參數的自定義對象一起使用?

+3

與標準容器一樣,您需要爲QVector提供默認的可構造類型。 –

+0

@πάνταῥεῖC++ 11標準容器不需要默認構造項目。項目上的需求位置特定於您如何使用容器。例如,如果您可以使用'emplace_'而不是'push_'方法,'std :: list'甚至不需要可複製項目。 –

回答

5

問題是,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); 
2

提供非默認參數QVector constructor

例如:下面的創建10個RoutineItem元素具有相同NamePositionTime

QVector<RoutineItem> foo(10, RoutineItem("name", 123, 100)); 
              ^ ^ ^
              |  |  | 
              +-----+-----+-----Provide arguments 
1

如果你願意使用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一起使用。

相關問題