Problem z konstruktorem i tablicą wskaźników.

0

Witam.

Mam stworzoną klasę z danymi typu double i w niej konstruktor domyślny oraz konstruktor z argumentami przechowującymi wartości dla inicjalizacji tych double pól. Ponadto mam zadeklarowaną globalnie tablicę wskaźników do obiektów tej klasy.

Muszę napisać funkcję, która stworzy nowy obiekt dynamiczny poprzedzone uzyskaniem od użytkownika
wartości wszystkich atrybutów dla tego obiektu, a następnie doda jego adresu do
tablicy wskaźników.

Nie wiem jak wywołać konstruktor w definicji funkcji tak, aby zmienił obiekt wskazywany przez konkretny wskaźnik z tablicy. Ktoś wie?

Klasa (fragment):

class zaglowka {
protected:
	double rozmiar;
	double l_pas;
	double wek_x;
	double wek_y;
public:
	friend void pob_dane(void);
	friend void wyswietl(void);
	friend void skala(double k);
	friend void przesuniecie(double x, double y);

	zaglowka();
	zaglowka(double a, double b, double c, double d);

Konstruktor (nie domyślny):

zaglowka::zaglowka(double a, double b, double c, double d) {
		rozmiar = a;
		l_pas = b;
		wek_x = c;
		wek_y = d;
};

Tablica wskaźników:

zaglowka * wsk[3];

Funkcja:

void utworz(void)
{
	double rozm_temp;
	double l_pas_temp;
	double wek_x_temp;
	double wek_y_temp;

	printf("Podaj rozmiar zaglowki: ");
	scanf("%lf", &rozm_temp);
	printf("Podaj liczbe pasazerow zaglowki: ");
	scanf("%lf", &l_pas_temp);
	printf("Podaj wektor x zaglowki: ");
	scanf("%lf", &wek_x_temp);
	printf("Podaj wektor y zaglowki: ");
	scanf("%lf", &wek_y_temp);

	wsk[0] = new zaglowka;

	zaglowka(rozm_temp, l_pas_temp, wek_x_temp, wek_y_temp);
}

Chcę żeby ten konstruktor wywołało właśnie dla wsk[0].

0
wsk[0] = new zaglowka(argumenty)

?

0

Dziękuję i pozdrawiam.

0

Jeszcze jedno pytanie.

Mam do napisania konstruktor kopiujący, którego argumentem jest referencja do obiektu drugiej klasy.
Następnie konstruktor kopiuje tylko te pola, które się powtarzają w obu klasach, a resztę ustawia domyślnymi wartościami.
Jak to zrobić?

0

Hm. Normalnie?

KlasaA(const KlasaB &be)
{
  polea=be.polea;
  poleb=be.poleb;
  polec=0;
  poled=WARTOSC_DOMYSLNA;
}
0

Rada pomocna.

Jednak nie koniec problemów.
Oto kod:

#include <cstdio>
#include <cstdlib>

class zaglowka {
protected:
	double rozmiar;
	double l_pas;
	double wek_x;
	double wek_y;
public:
	friend void wyswietl(void);

	friend void kopiuj_2(void);

	zaglowka();
	zaglowka(double a, double b, double c, double d);
	zaglowka(zaglowka &kopia);
	zaglowka(jacht &kopia2);

	void wyswietl(void)
	{
		printf("Rozmiar statku to: %.2lf\n", rozmiar);
		printf("Max liczba pasazerow to: %.2lf\n", l_pas);
		printf("Wektor predkosci to: [ %.2lf . %.2lf ] .\n", wek_x, wek_y);
	}
};

zaglowka::zaglowka() {
	rozmiar = 1;
	l_pas = 0;
	wek_x = 0;
	wek_y = 0;
};

zaglowka::zaglowka(double a, double b, double c, double d) {
		rozmiar = a;
		l_pas = b;
		wek_x = c;
		wek_y = d;
};

zaglowka::zaglowka(zaglowka &kopia) {
	rozmiar = kopia.rozmiar;
	l_pas = kopia.l_pas;
	wek_x = kopia.wek_x;
	wek_y = kopia.wek_y;
};

zaglowka::zaglowka(jacht &kopia2) {
	rozmiar = 1;
	l_pas = 0;
	wek_x = kopia2.wek_x;
	wek_y = kopia2.wek_y;
};


//###########################################
class jacht {
protected:
	double rozmiar;
	double l_pas;
	double wek_x;
	double wek_y;
public:
	friend void pob_dane(void);
	friend void wyswietl(void);

	friend void kopiuj_2(void);

	void pob_dane(void)
	{
		printf("Podaj rozmiar statku: ");
		scanf("%lf", &rozmiar);

		printf("Podaj maksymalna liczbe pasazerow: ");
		scanf("%lf", &l_pas);

		printf("Podaj skladowa x wektora predkosci statku: ");
		scanf("%lf", &wek_x);

		printf("Podaj skladowa y wektora predkosci statku: ");
		scanf("%lf", &wek_y);
	}

	void wyswietl(void)
	{
		printf("Rozmiar statku to: %.2lf\n", rozmiar);
		printf("Max liczba pasazerow to: %.2lf\n", l_pas);
		printf("Wektor predkosci to: [ %.2lf . %.2lf ] .\n", wek_x, wek_y);
	}
};

zaglowka * wsk[3];

jacht * wsk2[3];

void utworz(void);
void utworz_2(void);
void kopiuj(void);
void kopiuj_2(void);

//###########################################

int main (void)
{
	int i;

		printf("Tworzenie nowego obiektu z podawaniem danych. \n");
		utworz();
		wsk[0]->wyswietl();
		printf("\n");

		printf("Tworzenie nowego obiektu bez podawania danych. (konstruktor domyslny)\n");
		utworz_2();
		wsk[1]->wyswietl();

		printf("Tworzenie nowego obiektu przez kopiowanie. (konstruktor kopiujacy)\n");
		kopiuj();
		wsk[2]->wyswietl();

		
	printf("\n");

	for(i=0;i<3;i++)
	{
		wsk2[i] = new jacht;
		printf("Podaj dane dla jachtu nr %d :\n", i+1);
		wsk2[i]->pob_dane();
		printf("\n");
	}
	
	for(i=0;i<3;i++)
	{
		printf("Dane jachtu nr %d :\n", i+1);
		wsk2[i]->wyswietl();
		printf("\n");
	}

	printf("\n");

	printf("Tworzenie nowego obiektu na podstawie innego typu. (konstruktor kopiujacy)\n");
	

	for(i=0;i<3;i++)
	{
		delete wsk[i];
	}

	for(i=0;i<3;i++)
	{
		delete wsk2[i];
	}
return 0;
}

//######################################################
void utworz(void)
{
	double rozm_temp;
	double l_pas_temp;
	double wek_x_temp;
	double wek_y_temp;

	printf("Podaj rozmiar zaglowki: ");
	scanf("%lf", &rozm_temp);
	printf("Podaj liczbe pasazerow zaglowki: ");
	scanf("%lf", &l_pas_temp);
	printf("Podaj wektor x zaglowki: ");
	scanf("%lf", &wek_x_temp);
	printf("Podaj wektor y zaglowki: ");
	scanf("%lf", &wek_y_temp);

	wsk[0] = new zaglowka(rozm_temp, l_pas_temp, wek_x_temp, wek_y_temp);
}

void utworz_2(void)
{
	wsk[1] = new zaglowka;
}

void kopiuj(void)
{
	wsk[2] = new zaglowka(* wsk[0]);
}

void kopiuj_2(void)
{
	int z;
	printf("Podaj z ktorego obiektu klasy jacht chcesz skopiowac dane: ");
	scanf("%d", &z);
	wsk[3] = new zaglowka(* wsk2[z]);
}

I błedy:

klasy_2.cpp(18) : error C2143: syntax error : missing ')' before '&'
klasy_2.cpp(18) : error C2143: syntax error : missing ';' before '&'
klasy_2.cpp(18) : error C2460: 'zaglowka::jacht' : uses 'zaglowka', which is being defined
klasy_2\klasy_2.cpp(4) : see declaration of 'zaglowka'
klasy_2.cpp(18) : error C2059: syntax error : ')'
klasy_2.cpp(18) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
klasy_2.cpp(49) : error C2065: 'kopia2' : undeclared identifier
klasy_2.cpp(49) : error C2597: illegal reference to non-static member 'zaglowka::jacht'
klasy_2\klasy_2.cpp(49) : error C2448: 'zaglowka::{ctor}' : function-style initializer appears to be a function definition
klasy_2\klasy_2.cpp(191) : error C2664: 'zaglowka::zaglowka(zaglowka &)' : cannot convert parameter 1 from 'jacht' to 'zaglowka &'

Proszę. Pilne [!!!]

0
zaglowka(jacht &kopia2);

Tutaj typ jacht nie jest znany kompilatorowi (jego deklaracja jest wcześniej). Przed deklaracją zaglowka dodaj:

class jacht;

Pomijając już dość dziwną architekturę programu...

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