我将以下数据结构作为名为“Task”的类:
private:
string name;
int computation_time;
int period;
此外,我有一个包含以下内容的ASCII文件:
A 3 10
B 2 12
C 1 11
name = A,computation_time = 3,period = 10等......
现在我想读入文件,创建Task-object并将其推回到vector:
void read_in_task_list_and_create_tasks(const string &filename, vector<Task> ¤t_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对象是完全正确的,但如果它被推回,它就会失去上面描述的值。
这可能是Task-class中的Copy-Constructor问题,因为std :: vector正在管理内存分配吗?
我在Linux x86上使用带有g ++编译器的netbeans。
THX
答案 0 :(得分:5)
确保没有定义复制构造函数或赋值运算符。
自动的应该完全按照你想要的那样做。
答案 1 :(得分: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> ¤t_tasks)
{
std::ifstream in(filename.c_str());
std::copy(std::istream_iterator<Task>(in),
std::istream_iterator<Task>(),
std::back_inserter(current_tasks));
}
作为一个奖励,这也将解决你的问题,因为你的循环是错误的(因为,我知道你没有提到,但根据你如何写你的循环,它基本上是不可避免的。)
答案 2 :(得分:2)
Task是否定义了复制构造函数和赋值运算符?当你将对象推入向量时,它并没有将那个对象推入,它正在复制它。所以我相信你需要定义其中一个(我不记得哪个,但是如果你定义的话,定义它们总是好的。)