[G++][Ubuntu][Problem] no match for call to...

0

Witam, mam problem z ów programem, siedziałem dzisiaj pół dnia nad tym jednym problemem, ale nie potrafię sobie z tym już poradzić. Podczas kompilacji (za pomocą 'gcc') wyskakuje mi błąd:
main.cpp: In function ‘int main()’:
main.cpp23: error: no match for call to ‘(Image) (int&, int&)’
skakałem, latałem, ale już nie mam siły i nie wiem co tutaj mam zrobić. Komenda jaką wpisywałem do terminala to:
g++ main.cpp -g -Wall -pedantic -o main.out
Oddam duszę za pomoc.
Program aktualnie nie jest dokonczony, ale to raczej nie powoduje błędów przy kompilacji.

//Image.h

#include <iostream>

#ifndef IMAGE_H
#define IMAGE_H

typedef unsigned char byte;

class Image
{
	public:
		Image();
		Image(int width, int height);
		Image(const Image& c_Image);
		//Image& operator=(const Image& c_Image);	
		void fillInImage(byte value);
		byte getPix(int pix_w, int pix_h);
		void fillPix(int pix_w, int pix_h, byte value);
		int getWidth();
		int getHeight();
		void createImage(int n_width_top, int n_height_top, int n_width_bottom, int n_height_bottom);
		void showImage();
		~Image();
	private:
		int width_p;
		int height_p;
		byte **tab;

};

#endif 

//Image.cpp

 
#include <iostream>
#include "Image.h"

using namespace std;

Image::Image(){}
Image::Image(int width, int height) : width_p(width), height_p(height)
{
	this->tab=new byte*[width_p];
	for(int i=0; i<width_p; i++)
		this->tab[i]=new byte[height_p];
}

Image::Image(const Image& c_Image)
{
	this->width_p=width_p;
	this->height_p=height_p;
	for(int i=0; i<width_p; i++)
	{
		for(int j=0; j<height_p; j++)
			this->tab[i][j]=tab[i][j];
	}
}

/*Image& Image::operator=(const Image& c_Image)
{
	
}*/
void Image::fillInImage(byte value)
{
	for(int i=0; i<width_p; i++)
	{
		for(int j=0; j<height_p; j++)
			tab[i][j]=value;
	}
}
byte Image::getPix(int pix_w, int pix_h)
{
	return tab[pix_w][pix_h];
}
void Image::fillPix(int pix_w, int pix_h, byte value)
{
	tab[pix_w][pix_h]=value;
}
int Image::getWidth()
{
	return width_p;
}
int Image::getHeight()
{
	return height_p;
}
void Image::createImage(int n_width_top, int n_height_top, int n_width_bottom, int n_height_bottom)
{
	Image n_Image(n_width_bottom-n_width_top, n_height_bottom-n_height_top);
	for(int i=n_width_top; i<n_width_bottom; i++)
	{
		for(int j=n_height_top; j<n_width_bottom; j++)
			n_Image.fillPix(i, j, tab[i][j]);
	}
}
void Image::showImage()
{
	for(int i=0;i<width_p;i++)
	{
		for(int j=0;j<height_p;j++)
			cout << tab[i][j];
		cout << endl;
	}
}
Image::~Image()
{
	for(int i=0; i<height_p; i++)
		delete [] tab[i];
	delete [] tab;
}

//main.cpp <-- główny program

#include <iostream>
#include "Image.h"

using namespace std;

int main()
{
	int opt;
	int width, height;
	Image obraz;
	cout << "Program implementuje dwywymiarowy obraz monochromatyczny"<<endl;
	cout << "Menu:" << endl;
	cout << "1. Inicjalizacja obrazu (konstruktor)" << endl;
	cout << "2. Inicjalizacja koloru obrazu (jednolity)" << endl;
	cout << "3. Odczyt piksela (odcien)" << endl;
	cout << "4. Zapis piksela (pojedynczy)" << endl;
	cout << "5. Rozdzielczość obrazu" << endl;
	cout << "6. Skopiowanie obrazu (konst. kopiujacy)" << endl;
	cout << "7. Kopia fragmentu obrazu. " << endl;
	cout << "8. Wyswietlenie obrazu." << endl;
	cout << "0. Zamkniecie aplikacji.";
	cout << "Wybierz opcję: ";
	cin >> opt;
	do
	{
		switch(opt)
		{
		case 1:
			cout<<"Inicjalizacja obrazu (dzialanie konstruktora)" << endl;
			cout<<"Podaj szerokosc obrazu: ";
			cin >> width;
			cout<<"Podaj wysokosc obrazu: ";
			cin >> height;
			obraz(width, height);
		break;
		}
	}while(opt==0);
	return 0;
} 
0

Zmienna obraz jest tworzone na początku main, natomiast w 34 linii wywołujesz konstruktor(funkcję bezargumentową(?)) na istniejącym już obiekcie i progarm się nie kompiluje.

0
Hostel napisał(a):

Zmienna obraz jest tworzone na początku main, natomiast w 34 linii wywołujesz konstruktor(funkcję bezargumentową(?)) na istniejącym już obiekcie i progarm się nie kompiluje.

Właśnie, jak powinienem stworzyć "obraz" typu Image, dla dwóch argumentów "width, height". Mam zdefiniowany taki konstruktor w pliku Image.cpp.

0

tak jak teraz zrobiłeś, to w jednej linijce musi być definicja zmiennej i inicjalizacja:

Image obraz(width, height);

możesz też tworzyć obiekt dynamicznie:

Image *obraz;
...
obraz = new Image(width, height);
...
delete obraz;

ale lepiej jest chyba inicjalizację przenieść z konstruktora do metody, a konstruktor zostawić bezparametrowy i pusty:

Image obraz;
...
obraz.Init(width, height);
0
Azarien napisał(a):

tak jak teraz zrobiłeś, to w jednej linijce musi być definicja zmiennej i inicjalizacja:

Image obraz(width, height);

możesz też tworzyć obiekt dynamicznie:

Image *obraz;
...
obraz = new Image(width, height);
...
delete obraz;

ale lepiej jest chyba inicjalizację przenieść z konstruktora do metody, a konstruktor zostawić bezparametrowy i pusty:

Image obraz;
...
obraz.Init(width, height);

Dziękuję za pomoc, powyższa informacja pomogła rozwiązać problem. :]

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