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

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\ :)

0

Parametr funkcji cmax przekaż jako referencję.

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

};
0

To warto zmienić:

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

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