konstruktor kopiujący - przekazywanie kolejki struktór do funkcji.

Odpowiedz Nowy wątek
2013-05-17 10:04
0

Siema. Piszę pewien program, chciałbym do funkcji cmax przekazywac jako argument kolejkę priorytetową pq. Kolejka ta składa się z struktur typu Task. Niestety (albo na szczęście) kompilator wywala mi " error C2558: struct 'Task' : no copy constructor available or copy constructor is declared 'explicit' ". Pytanie co zrobić aby móc przekazać taką kolejkę do funkcji.

Moja struktura:

struct Task
{
    //jakas tab lub wektor
          int nr;   //numer zadania
          vector < int > czasy;

          Task(){}      //konstruktor domyslny

          Task(int nrr, vector < int > czasyy):nr(nrr),czasy(czasyy){}  //konstruktor param

          Task (Task & wzor)      //konstruktor kopiujacy
          {
                this->nr = wzor.nr;
                this->czasy = wzor.czasy;
          }

};

Funkcja cmax do której chcę przekazać kolejkę priorytetową:

int cmax(priority_queue<Task, vector<Task>,compare1> kolejka){ 

priority_queue<Task, vector<Task>,compare1> pom_k;      
priority_queue<Task, vector<Task>,compare1> trolo;  
int **tab=NULL;

//pobranie wymiarów (m i s)
int s=kolejka.size(); //wyzłuskanie s
int m=0; //wyłuskanie m
new Task; 
Task ccc; 
    ccc = kolejka.top();
    kolejka.pop();
    m = ccc.czasy.size();

//kopiowanie kolejki żeby nie zmieniać tej wejściowej (do trolo z kolejki)
while (!kolejka.empty())
         {
             new Task;  
             Task aa = kolejka.top();
             kolejka.pop();            //ta kolejka wejsciowa robi sie pusta
             trolo.push( Task(aa) ); //kolejka wyjściowa
             pom_k.push( Task(aa) ); //kolejka pomocnicza
         }
                //odtworzenie kolejki pq
             while (!pom_k.empty())
                 {
                     new Task;  
                     Task bb = pom_k.top();
                     pom_k.pop();            //ta kolejka pomocnicza robi się pusta
                     kolejka.push( Task(bb) ); //kolejka odtworzona 'kolejka
                  }

//tworze tablice o wymiarze s na m (czyli wymiar wczytanej kolejki)
tab = new int*[s];
for(int x = 0; x < s; x++) {
tab[x] = new int[m];
}

//przepisanie trolo do tablicy 'tab'..trolo jest puste i nie potrzebne
for(int i=0;i<s;i++){   //do tab przepisuje tyle tasków ile wynosi s
        new Task; 
        Task po; 
        po = trolo.top();
        trolo.pop();  
        for(int j=0;j<m;j++){
                tab[i][j]=po.czasy[j];  //każdy czas przepisuje
            }
        }           

//obliczas cmaxa..zwraca liczbę int 'cm' która jest cmaxem dla danej kolejki
for(int w=0;w<s;w++){
    for(int z=0;z<m;z++){
        if(w==0){
            if(z==0){
                tab[0][z]=tab[0][z];
            }else{
                tab[0][z]=tab[0][z-1]+tab[0][z];
            }
        }else{
            if(z==0){
                tab[w][z]=tab[w-1][z]+tab[w][z];
            }else{
            if(tab[w-1][z]<tab[w][z-1]){
                tab[w][z]=tab[w][z-1]+tab[w][z];
            }else{
                tab[w][z]=tab[w][z]+tab[w-1][z];
            }
        }
        }
    }
}
int cm = tab[s-1][m-1];
return cm;
};

no i funkcja main:

int main(){
    int size, ile_m;    //ile zadan, ile maszyn
    int **t = NULL;     //tablica na wszystko potrzebna do funkcji cmax
    int **tc = NULL;    //tablica na cząstkowe uszeregowania
    int c=0;            //w to wpisuje cmaxa zwroconego przez c max
    vector < int > tajmy; //poszczególne czasy
    int tajm;
    priority_queue<Task, vector<Task>,compare1> pq; //kolejka na taski(posegregowane)_wejsciowa

                /*wczytywanie z pliku, taski będą na kolejce prio. pq*/
    ifstream in;
    in.open(IN);            
    if(in.good())
    {
        in >> size;     //wczytaj rozmiar
        in >> ile_m;    //wczytaj ilosc kolumn

        for(int i=0;i<size;i++){
            tajmy.clear();
            for(int j=0;j<ile_m;j++){
                in >> tajm;
                tajmy.push_back(tajm);
            }
            pq.push( Task(i+1, tajmy) );
        }

            in.close();
    }else cout <<"Blond odczytu w calosci. koncze wasc panie, co by nie wstydzic nadzbyt"<<endl;

    c=cmax(pq); //TU CHCĘ PRZEKAZAĆ KOLEJKĘ PQ

}

Proszę o pomoc\ :)

Pozostało 580 znaków

2013-05-17 11:49
DRK
0

Parametr funkcji cmax przekaż jako referencję.

Pozostało 580 znaków

2013-05-19 09:53
0

Odpowiadam sam sobie. referencja potrzebna nie jest. dodalem const widac gdzie (Task (const Task & wzor))w Tasku i jeszcze troche rzeczy jak destruktor np.

class Task
{
    //jakas tab lub wektor
public:
        int nr; //numer zadania
          vector < int > czasy;

          Task(){}      //konstruktor domyslny

          Task(int nrr, vector < int > czasyy):nr(nrr),czasy(czasyy){}  //konstruktor param

          Task (const Task & wzor)      //konstruktor kopiujacy
          {
                this->nr = wzor.nr;
                this->czasy = wzor.czasy;
          }

          ~Task(){}

          Task & operator = (const Task & wzor)
          {
            if(& wzor != this )
            {
                this->nr = wzor.nr;
                this->czasy = wzor.czasy;

            }
          return *this;
          }

};
edytowany 1x, ostatnio: kokosz1, 2013-05-19 09:53

Pozostało 580 znaków

2013-05-19 10:00
0

To warto zmienić:

Task(int nr,const vector<int> &czasy):nr(nr),czasy(czasy) {}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0