2016-04-22 55 views
0

我的錯誤是我想將directory讀入字符串向量。使用成員函數getFileList。在主要向量中迭代它是空的。我只填寫一個字符串(緩衝區)來檢查向量,並且沒有列出任何文件。只有以下輸出:爲什麼我的字符串向量爲空

Singleton cstr 
//verify success in opening dir 
opened? [0x1d92630 ] 
[ buffer ] 
itVect[ buffer ] 

爲什麼?

#include <iostream> 
#include <string> 
#include <tuple> 
#include <vector> 
#include <dirent.h> 
#include "gtest/gtest.h" 

class Singleton 
{ 

public: 
    std::vector<std::string> singletonVect; 
    Singleton(); 
    void buildFileList(std::vector<std::string> filesVect); 
    std::vector<std::string> getFileList(void); 
    static Singleton& getInstance(); 
}; 

std::vector<std::string> strings = {"lkhdf","lfdjasdlk"}; 
Singleton& singleObj(Singleton::getInstance()); 

std::vector<std::string> openDirectory(std::string path) //opening any folder and saving all file-names in a vector<string> 
{ 
    DIR* dir; 
    dirent* pdir; 
    std::vector<std::string> files; 
    dir = opendir(path.c_str()); 

    std::cout << "opened? [" << dir << " ]\n"; 

    while (pdir = readdir(dir)) { 
     files.push_back(pdir->d_name); 
    } 
    return files; 
} 

void Singleton::buildFileList(std::vector<std::string> filesVect) 
{ 
    std::vector<std::string> f; 
    std::string buffer = ""; 
    f = openDirectory("myFiles"); // pass which dir to open 
    for (auto i = f.begin(); i != f.end(); ++i) { 
     if ((*i).find(".exe") != std::string::npos) { 
     buffer = "myFiles/" + (*i); 
     filesVect.push_back(buffer); 
     } 
    } 
} 

std::vector<std::string> Singleton::getFileList(void) 
{ 
    return singletonVect; 
} 

Singleton::Singleton() 
{ 
    std::cout << "Singleton cstr\n"; 

    buildFileList(singletonVect); 
} 

Singleton& Singleton::getInstance() 
{ 
    static Singleton singleObj; 
    return singleObj; 
} 

int main(int argc, char **argv) { 
    singleObj.singletonVect = singleObj.getFileList(); 

    singleObj.singletonVect.push_back("buffer"); 

    std::cout <<"[ "<< (*singleObj.singletonVect.begin()) << " ]\n"; 

    for (auto itVect = singleObj.singletonVect.begin(); itVect != singleObj.singletonVect.end(); itVect++) { 
     std::cout << "itVect[ " << (*itVect) << " ]\n"; 
    } 

} 
+1

歡迎來到Stack Overflow!這聽起來像你可能需要學習如何使用調試器來遍歷代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:** [如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

回答

3

的一個問題是在這裏:

void Singleton::buildFileList(std::vector<std::string> filesVect)

你按值傳遞filesVect,這意味着該函數正在與一個暫時的。當函數返回時,您將所有物品添加到矢量中的所有努力工作都會冒煙並消失。

通過引用傳遞,而不是:

void Singleton::buildFileList(std::vector<std::string>& filesVect)

這是沒有什麼不同,如果你這樣做:

int foo(int x) 
{ 
    x = 10; 
} 

int main() 
{ 
    int myInt = 0; 
    foo(myInt); 
    // myInt is still 0, not 10 
} 

注意foo()按值取int參數。即使foo()更改了參數,對呼叫者的int也沒有做任何更改。

2

很簡單的錯誤。不要再這樣做。通過參考:

變化

void buildFileList(std::vector<std::string> filesVect); 

void buildFileList(std::vector<std::string>& filesVect); 

同樣在這裏:

void Singleton::buildFileList(std::vector<std::string>& filesVect) 
{ 
    std::vector<std::string> f; 
    std::string buffer = ""; 
    f = openDirectory("myFiles"); // pass which dir to open 
    for (auto i = f.begin(); i != f.end(); ++i) { 
     if ((*i).find(".exe") != std::string::npos) { 
     buffer = "myFiles/" + (*i); 
     filesVect.push_back(buffer); 
     } 
    } 
} 

和它的作品。

相關問題