0

プログラム内に、特定のディレクトリ内のファイルの数をカウントする関数があります。この関数は、入力パラメーターをディレクトリーの名前およびファイル名の拡張子(ディレクトリーでカウントする必要のあるファイルのタイプ)として受け取ります。

関数の呼び出し元が入力パラメーターとして使用できる任意の数のファイル拡張子を指定できるように、それを汎用的にしたいと思います。その後、それらの拡張子を持つ特定のファイルがカウントされます。

void getNames(string dirName,  string fileExtension1, string fileExtension2, string fileExtension3){

vector<string> fileNames = //do some operations

if(fileType == fileExtension1 || fileType==fileExtension2....){
//increase count
}

return fileNames;
}

この関数を変更して、任意の数のパラメーターを受け取り、関数内で同じパラメーターを使用してファイルの数を計算するにはどうすればよいですか?

4

2 に答える 2

7

最も厄介な方法は、拡張機能のベクトルを渡すことです

void getNames(string dirName, const vector<string>& fileExtensions)

今、あなたはループifの中にいるでしょうfor

for(int i = 0; i<fileExtensions.size();i++){

    if(fileType == fileExtension[i]){
        //increase count
        break;// this might be needed to ensure no multiple positives? depending on what you want to do.
    }

}
于 2012-12-17T08:25:52.223 に答える
0

コードには、タイプベースの決定があります。

if(fileType == fileExtension1 || fileType==fileExtension2....){
//increase count
}

return fileNames;
}

多くのfileTypeと関数を操作する場合、fileType固有の操作が必要になるたびに、広範なタイプベースの決定ロジックが作成されます(このタイプの場合はそれを実行し、そうでない場合は.. 。)。

関数は「fileType」(拡張子)に基づいて「fileName」に対して何かを実行しているため、各ファイルには名前と拡張子があるため、両方をクラスFileにカプセル化することを検討してください。これで、関数は一連のFileオブジェクトを操作します。ファイルオブジェクトのセットが多くの場所で作業しているものである場合は、ファイルを格納するためのベクトル、リスト、または任意のコンテナを使用して実装できるFileSetなどのクラスを定義できます。このようにして、たとえば、単一の引数を取る関数がconst FileSet&作成され、残りのコードはFileクラスによって処理されます。とにかく、これは明確な答えではありません。コードのOOdesignについて考えることをお勧めします。

于 2012-12-17T08:43:02.833 に答える