2015-12-06 77 views
-3

如何通過函數參數來修正返回創建的std :: list?現在,我嘗試這樣:C++在函數中創建std :: list並通過參數返回

bool DatabaseHandler::tags(std::list<Tag> *tags) 
{ 
    QString sql = "SELECT * FROM " + Tag::TABLE_NAME + ";"; 
    QSqlQueryModel model; 
    model.setQuery(sql); 

    if(model.lastError().type() != QSqlError::NoError) { 
     log(sql); 
     tags = NULL; 
     return false; 
    } 

    const int count = model.rowCount(); 

    if(count > 0) 
     tags = new std::list<Tag>(count); 
    else 
     tags = new std::list<Tag>(); 
//some code 

    return true; 
} 

後,我可以用它:

std::list<Tag> tags; 
mDB->tags(&tags); 

現在,我解決我的功能:

bool DatabaseHandler::tags(std::list<Tag> **tags) 
{ 
    QString sql = "SELECT * FROM " + Tag::TABLE_NAME + ";"; 
    QSqlQueryModel model; 
    model.setQuery(sql); 

    if(model.lastError().type() != QSqlError::NoError) { 
     log(sql); 
     *tags = NULL; 
     return false; 
    } 

    const int count = model.rowCount(); 

    if(count > 0) 
     *tags = new std::list<Tag>(count); 
    else 
     *tags = new std::list<Tag>(); 

    for(int i = 0; i < count; ++i) { 
     auto record = model.record(i); 
     Tag tag(record.value(Table::KEY_ID).toInt()); 
     (*tags)->push_back(tag); 
    } 

    return true; 
} 

它的工作原理,但列表返回大小4雖然循環的執行只有2次迭代和空的子對象(如果我只是調用它們的默認構造函數)。標籤類沒有複製構造函數。

+0

告訴我們什麼是「標籤」將有所幫助 –

回答

2

由於您將已經實例化的列表作爲指向該函數的指針,因此不需要創建另一個列表。 從這個意義上說,你的問題很不明確。我建議你閱讀一下關於指針,引用和函數調用的一般信息。

http://www.cplusplus.com/doc/tutorial/pointers/ http://www.cplusplus.com/doc/tutorial/functions/

更新:我還是強烈建議你提到的話題讀了,因爲你不知道這些基本點。 無論如何,這是什麼,你可能想要做的(事件雖然我使用的引用表明,這裏是指針的解決方案):

bool someFunc(std::list<Tag> **tags) { 
    // by default null the output argument 
    *tags = nullptr; 
    if (error) { 
     return false; 
    } 

    // dereference tags and assign it the address to a new instance of list<Tag> 
    *tags = new std::list<Tag>(); 
    return true 
} 


std::list<Tag> *yourList; 
if (someFunc(&yourList)) { 
    // then yourList is valid 
} else { 
    // then you had an error and yourList == nullptr 
} 

然而,這不是地道的C++。請閱讀現代書籍或教程。

+0

我知道我可以將已初始化的對象的指針作爲函數參數傳遞,但我想將列表初始化移動到函數體中。 –

+0

現在,我可以在函數參數中使用雙指針,它可以工作,但列表返回大小爲4,但我只傳遞了兩個值。它壓碎了我的大腦。 –

+0

謝謝!我做了初始化函數,但我非常需要了解如何編寫這個變體(我只開始研究C++)。 –

1

使用參考。

bool DatabaseHandler::tags(std::list<Tag>& tags); 

std::list<Tag> tags; 
mDB->tags(tags); 

你必須改變所有的->.,當然。在函數中對參考進行的每個操作都將完成到它被調用的原始列表tags

編輯:如果你想創建函數內的列表並返回它,你有幾個選項。我認爲最接近的就是返回一個列表指針,如果函數失敗,返回nullptr

//beware, pseudocode ahead 
std::list<Tag>* DatabaseHandler::tags() //return new list 
{ 
    if (success) 
     return new std::list<Tag>(...); //construct with whatever 
    else 
     return nullptr; //null pointer return, didn't work 
} 

std::list<Tag> tags* = mDB->tags(); 

你可以或者有它返回一個空列表,而不是,這取決於你怎麼想它的工作。參考一個指針也會以同樣的方式工作。

bool DatabaseHandler::tags(std::list<Tag>*&); //return true/false 

    std::list<Tag>* tags; 
    mDB->tags(tags); //tags will be set to point to a list if it worked 
+0

我需要將列表初始化爲函數體。 –

+0

感謝您的回答,它的工作原理! –

相關問題