2010-11-18 22 views
0

Ben "Görev" adlı bir sınıf olarak aşağıdaki veri yapısı vardır:C vektörü meraklı davranışı ++ :: push_back()

A 3 10 
B 2 12 
C 1 11 
:

private: 
string name; 
int computation_time; 
int period; 

Ayrıca ben bu içeriğe sahip bir ASCII dosyası var

name = A, computation_time = 3 dönem = 10 ve benzeri ....

Şimdi ben dosyasında okumak istiyorum, Görev-nesne oluşturmak ve bir vektör geri itin:

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

Şimdi, current_tasks vektörüne baktığımda, öğelere sahip, ancak değerleri benim in_file değerlerimle uyuşmuyor. Çıkan satırları izleyin. tmp_task nesnesi tam olarak doğrudur, ancak geri itilirse, yukarıda açıklandığı gibi değerlerini kaybeder. std :: vector bellek tahsisi yönetmektedir çünkü

bu, Görev-sınıfında Kopya Yapıcı Sayı olabilir mi?

Ben Linux x86 üzerinde gr ++ derleyici ile netbeans kullanıyorum.

THX

+3

'Task' sınıfı için tam tanımını gönderir misiniz? – SingleNegationElimination

cevap

5

tanımlı hiçbir kopya kurucular veya atama operatörleri olmadığından emin olun.

otomatik olanları tam olarak ne istediğinizi yapmalıdır.

2

mu Görev kopya kurucu ve atama operatörü tanımladınız mı? Nesneyi vektöre doğru bastığınızda, onu tam olarak itmemek, kopyalamaktır. Öyleyse, tanımlanacak olanlardan birine ihtiyacın olduğuna inanıyorum (hangisini hatırlamıyorum, ama her ikisini de tanımladığımızda tanımlamak her zaman iyidir).

+1

Varsayılan kopya yapıcı, verilen üyelerle doğru şeyi yapmalıdır. Elbette, Askener kendi kopya kurucusunu ilan ederse, bunun işe yaradığından emin olmalı. – jamesdlin

+0

Unutmayın, kurucu veya operatör = burada geçersiz kılınması gerekecek mi? – Herms

+0

Görev :: Görev (const Görev & orij) { } Bu netbeans benim için yaratılmış şeydir. Bu önceden tanımlanmış bir kopya yapıcı mı? çünkü ben şunu söyleyeyim -> name = orig.get_name() bir hata alıyorum .... – Askener

5

En azından IMO, çok fazla yapmak kendinizi çalışmaya çalışıyorum, biraz yanlış bir yaklaşım alıyoruz. Standart kütüphane zaten yaptığınız şeylerin çoğunu halledebilir.

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

Sonra aslında veri okumak için bir standart algoritma kullanmak ve vektör içine koyabilirsiniz:

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)); 
} 
gerçekten yapmanız gereken akışından tek bir nesneyi nasıl okunacağını belirtmek edilir

Bir bonus olarak, bu, aynı zamanda, dosyanızdaki son öğeyi iki kez okumanız nedeniyle yaşadığınız sorunu da giderir, çünkü döngünüz yanlıştı (evet, bunu söylemediğini biliyorum, ama döngüsünü nasıl yazdığına göre) esasen kaçınılmazdır).

+0

+1, love std :: 'algoritmalar :) – orip

+0

de bu problemim yok, çünkü dosyam newline ile bitmiyor, ama yine de ty gibi şeyler yapmak için çok hızlı ve kolay bir yaklaşım! – Askener

+0

+1, STL algoritmalarının güzel kullanımı. Sizin için "istream_iterator" yazımında bazı yazım hataları düzeltdim. – birryree