2016-04-22 9 views
0

私はWherが私の間違いですdirectoryを文字列ベクトルに読みたいです。メンバー関数getFileListを使用します。メインでそれを反復すると、文字列ベクトルは空です。私はベクトルをチェックするために1つの文字列(バッファ)だけを記入し、ファイルはリストされていません。次の出力のみが表示されます。なぜ私の文字列ベクトルは空です

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

ようこそスタックオーバーフロー!デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。詳しい読書:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

答えて

3

一つの問題はここにある:あなたが機能を一時的に動作していることを意味し、値によってfilesVectを渡している

void Singleton::buildFileList(std::vector<std::string> 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); 
     } 
    } 
} 

、それが動作します。

関連する問題