0

「タスク」という名前のクラスとして次のデータ構造があります。

private:
string name;
int computation_time;
int period;

さらに、次の内容の ASCII ファイルがあります。

A 3 10
B 2 12
C 1 11

名前 = A、計算時間 = 3、期間 = 10 など....

今、私はファイルを読み込んで、Task-object を作成し、それをベクトルにプッシュしたいと思います:

void read_in_task_list_and_create_tasks(const string &filename, vector<Task> &current_tasks)
{
    ifstream in_file;
    in_file.open(filename.c_str());

    string tmp_name;
    int tmp_computation_time;
    int tmp_period;

    while(!in_file.eof())
    {
        in_file >> tmp_name;
        in_file >> tmp_computation_time;
        in_file >> tmp_period;

//        Task tmp_task(tmp_name, tmp_computation_time, tmp_period);
//        current_tasks.push_back(tmp_task);
        current_tasks.push_back(Task(tmp_name, tmp_computation_time, tmp_period));
    }
}

現在、 current_tasks ベクトルを調べると、要素がありますが、それらの値は in_file の値と一致しません。アウトコメントされた行を見てください。tmp_task オブジェクトは正確ですが、プッシュバックされると、上記のように値が失われます。

std::vector がメモリ割り当てを管理しているため、これはタスク クラスのコピー コンストラクタの問題でしょうか?

Linux x86 で g++ コンパイラを使用して netbeans を使用しています。

THX

4

3 に答える 3

5

少なくとも IMO は、自分で多くの作業をしようとして、多少間違ったアプローチをとっています。標準ライブラリは、あなたがしていることのほとんどをすでに処理できます。本当に必要なのは、ストリームから単一のオブジェクトを読み取る方法を指定することだけです。

struct Task { 
    std::string name;
    int computation_time;
    int period;
};

std::istream &operator>>(std::istream &is, Task &t) {
    return is >> t.name >> t.computation_time >> t.period;
}

次に、標準のアルゴリズムを使用して実際にデータを読み取り、ベクターに入れることができます。

void read_in_task_list_and_create_tasks(const string &filename, 
                                        vector<Task> &current_tasks) 
{
    std::ifstream in(filename.c_str());

    std::copy(std::istream_iterator<Task>(in), 
              std::istream_iterator<Task>(),
              std::back_inserter(current_tasks));
}

おまけとして、これにより、ループが間違っていたためにファイルの最後の項目を 2 回読み取ったように見えるという問題も修正されます (はい、それについて言及していないことは知っていますが、ループの記述方法に基づいて、本質的に避けられない)。

于 2010-11-18T21:35:39.993 に答える
5

コピー コンストラクターまたは代入演算子が定義されていないことを確認してください。

自動のものは、まさにあなたが望むことをするはずです。

于 2010-11-18T21:27:46.590 に答える
2

Task にはコピー コンストラクターと代入演算子が定義されていますか? オブジェクトをベクトルに押し込むとき、それは正確なものを押し込むのではなく、コピーしています。したがって、これらのいずれかを定義する必要があると思います (どちらかは覚えていませんが、どちらかを定義する場合は常に両方を定義することをお勧めします)。

于 2010-11-18T21:22:52.717 に答える