1

私の問題にはおそらく非常に簡単な解決策がありますが、入力ファイルを (コマンドライン引数から) 解析のためにクラスに渡す際に問題が発生しています。

私のmain.cppコードの関連部分は次のとおりです。

#include <iostream>
#include <chrono>
#include "SortingCompetition.h"

int main(int argc, char** argv)
{
    if (argc != 3)
    {
        std::cerr << "Invalid arguments" << std::endl;
        std::cerr << "Usage: ./a.out <input file> <output file>" << std::endl;
        return 1;
    }

    SortingCompetition sorter(argv[1]);

    return 0;
}

SortingCompetition.h ファイルは次のとおりです。

#ifndef SORTINGCOMPETITION_H_
#define SORTINGCOMPETITION_H_

#include <string>
#include <vector>
using namespace std;

class SortingCompetition{
private:
    string& input_;
    vector<string> data_;
public:
    SortingCompetition(const string& inputFileName);
    void setFileName(const string& inputFileName);
    bool readData();
    bool prepareData();
    void sortData();
    void outputData(const string& outputFileName);
};

#endif

ここでは、すべての機能が同じままでなければなりません。つまり SortingCompetition(const string& inputFileName); 、そのままにしておく必要があります...constまたは他のものを削除することはできません。

関連する SortingCompetition の実装を次に示します。

#include "SortingCompetition.h"

SortingCompetition::SortingCompetition(const string& inputFileName){
    input_ = inputFileName;
}
void SortingCompetition::setFileName(const string& inputFileName){
    input_ =  inputFileName;
}

ここで問題が発生します。入力ファイルをコマンド引数からプライベート変数に正しく渡していません。かなり長い間検索しましたが、解決策が見つかりません。

4

1 に答える 1

2

正しく渡していますが、一時的な参照を保存しています。これが問題です。

変化する:

class SortingCompetition{
private:
    string input_;  // THIS LINE
    vector<string> data_;

これにより値がコピーされるため、コンストラクター (またはsetFilename) へのパラメーターが一時的なものであったことは問題ではありません。

于 2013-10-02T18:32:42.463 に答える