2010-11-18 5 views
0

Ich habe folgende Datenstruktur als eine Klasse mit dem Namen "Aufgabe":C++ neugierig Verhalten in vector :: push_back()

private: 
string name; 
int computation_time; 
int period; 

Außerdem habe ich eine ASCII-Datei mit folgendem Inhalt:

A 3 10 
B 2 12 
C 1 11 

name = A, computation_time = 3, Zeit = 10 und so weiter ....

Jetzt möchte ich in der Datei lesen, erstellen Aufgaben Objekt und schieben sie es zurück in einen Vektor:

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)); 
    } 
} 

Jetzt, wenn ich in current_tasks Vektor schaue, hat es Elemente, aber ihre Werte stimmen nicht mit meinen Werten in_file überein. Beobachten Sie die überkommenen Zeilen. tmp_task object ist genau richtig, aber wenn es zurückgeschoben wird, verliert es seine Werte wie oben beschrieben.

Könnte dies ein Kopier-Konstruktor-Problem in der Task-Klasse sein, weil std :: vector die Speicherzuweisung verwaltet?

Ich benutze Netbeans mit G ++ Compiler auf Linux x86.

THX

+3

Können Sie die vollständige Definition für die 'Task' Klasse veröffentlichen? – SingleNegationElimination

Antwort

5

Stellen Sie sicher, dass keine Kopierkonstruktoren oder Zuweisungsoperatoren definiert sind.

Die automatischen sollten genau das tun, was Sie wollen.

2

Does Aufgabe haben den Kopierkonstruktor und Zuweisungsoperator definiert? Wenn Sie das Objekt in den Vektor schieben, wird es nicht genau hineingedrückt, es kopiert es. Also ich glaube, dass Sie eine davon benötigen, um definiert zu werden (ich erinnere mich nicht an welche, aber es ist immer gut, beides zu definieren, wenn Sie beides definieren).

+1

Der Standardkopiekonstruktor sollte mit den gegebenen Mitgliedern das Richtige tun. Natürlich, wenn Asener seinen eigenen Kopier-Konstruktor erklärt, muss er sicherstellen, dass es funktioniert. – jamesdlin

+0

Ich vergesse, ist es Kopie Konstruktor oder Operator =, die hier überschrieben werden muss? – Herms

+0

Aufgabe :: Aufgabe (const Aufgabe & orig) { } das ist, was netbeans für mich erstellt hat. Ist das ein vordefinierter Copy-Konstruktor? denn wenn ich das sage-> name = orig.get_name() erhalte ich einen Fehler .... – Askener

5

Zumindest IMO, du nimmst den falschen Ansatz und versuchst selbst zu viel Arbeit zu machen. Die Standardbibliothek kann bereits den Großteil Ihrer Arbeit erledigen. Alles, was Sie wirklich tun müssen, ist festzulegen, wie ein einzelnes Objekt aus dem Stream zu lesen:

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; 
} 

Dann können Sie einen Standard-Algorithmus tatsächlich verwenden, um die Daten zu lesen und es in Ihren Vektor setzen:

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)); 
} 

Als Bonus wird dies auch das Problem beheben, dass Sie das letzte Element in der Datei scheinbar zweimal gelesen haben, weil Ihre Schleife falsch war (ja, ich weiß, dass Sie das nicht erwähnt haben, aber basierend darauf, wie Sie Ihre Schleife geschrieben haben, es ist im Wesentlichen unvermeidlich).

+0

+1, liebe die 'std :: 'Algorithmen :) – orip

+0

Nun, ich habe dieses Problem nicht, weil meine Datei nicht mit Newline endet, aber ty sowieso ist dies ein sehr schneller und einfacher Ansatz, um solche Dinge zu erledigen! – Askener

+0

+1, Nette Verwendung der STL-Algorithmen. Ich habe ein paar Tippfehler in der Schreibweise von 'istream_iterator' für dich korrigiert. – birryree

Verwandte Themen