Klasa wektor - operator +

0

Witam,

Posiadam klasę Vector i muszę zdefiniować dodawanie tych wektrów, lecz mam problem z operatorem +.
Bardzo proszę o pomoc w poprawieniu operatora +, napisanie operatora indeksacji [] i operatora = oraz pomocy jak wywołać potem dodawanie w mainie.

Operatory powinny zwracać nowy wektor.


class Vec
{
private:
string nazwa;
static int n; // rozmiar wektora (liczbą elementów tablicy wskazywanej przez V)
double *V; // wskazuje na poczatkowy element n elementowej tablicy

public:

Vec( int n, string nazwa)
{
cout<<endl<<"Wywolano konstruktor z parametrami."<<endl;
};

Vec ()
{
cout<<endl<<"Wywolano konstruktor bezparametrowy."<<endl;
};

Vec(const Vec &)
{
cout<<endl<<"Wywolano konstruktor kopiujacy."<<endl;
};

~Vec() /
{
cout<<endl<<"Wywolano destruktor."<<endl;
delete []V;
V = 0;
n--;
};


Vec * Vec::wprowadz()
{
int k; // liczba wektorow

cout<<"Podaj liczbe wektorow: ";
cin>>k;

Vec *V;
V = new Vec [k];

cout<<"Podaj dlugosc wektora: ";
cin>> n;
cout<<endl;

double *tablica = new double [n];

for (int j=0;j<k;j++)
{
cout<<"Podaj nazwe wektora: ";
cin>>V[j].nazwa;

for (int i=0;i<n;i++)
{
cout<<i+1<<"wspolrzedna: " << endl;
cin>> tablica[i];
}
}

return V;
}

Vec Vec::operator+(const Vec &b) const
{
Vec wynik;

for(int i=0; i<n; i++)
{
wynik[i] = this->V[i] + b.V[i];
//wektor1.V[i] = this->V[i] + wektor1.V[i];
}

return wynik;
}

0

Zacznijmy od tego, że nigdzie nie ustawiasz pola n w klasie, dodatkowo dlaczego pojedynczy wektor jest zbiorem wektorów? :|

0

Dodatkowo alokujesz pamięć dla lokalnej zmiennej a nie dla pola klasy...

0

Zapomniałem skopiować do posta.

int Vec::n = 0; // poza klasami, dla wszystkich funkcji.

Dlaczego pojedynczy wektor jest zbiorem wektorow? Jest tablicą w której są wektory, i chciałbym się odwołać do jej elementów, czyli współrzędnych, lecz właśnie nie potrafię tego zrobić...
Funkcja operator+ powinna zwracać wektor.

0

Zmieniłem na taką wersję, lepiej jest teraz?

------------------------------------------
int Vec::n = 0;

double * Vec::Wczytaj()
{
cout<<"Podaj nazwe wektora: ";
cin>> nazwa;
cout<<"Podaj dlugosc wektora: ";
cin>> n;
cout<<endl;

double *V;
V = new double [n];

cout<<"Podaj wspolrzedne: ";

for (int i=0;i<n;i++)
{
	cout<<i+1<<"wspolrzedna: " << endl;
	cin>> V[i];
}

return V;

}

Vec * Vec::wprowadz()
{
int k; // liczba wektorow
cout<<"Podaj liczbe wektorow: ";
cin>>k;

Vec *tablica;
tablica = new Vec [k];

for (int j=0;j<k;j++)
{
	cout << "Wprowadz dane wektora nr : " << j+1 << endl;
	tablica[j].Wczytaj();
}

return tablica;

}

**Vec Vec::operator+(Vec &b)
{
Vec wynik;
Vec * wynik = new Vec [wynik.n];

	for(int i=0; i<n; i++)
	{
		wynik[i] = this->V[i] + b.V[i];
		//wektor1.V[i] = this->V[i] + wektor1.V[i];
	}

return wynik;

}**

-------------------------------

Tylko w dalszym ciągu nie mogę się odwołać do elementów tablicy, bo gdy uruchamiam program, to mogę wpisać dane, ale sypie się gdy przechodzi do dodawania.

0

Posiadam klasę Vector i muszę zdefiniować dodawanie tych wektrów, lecz mam problem z operatorem +.

Tylko, że ta Twoja klasa nic nie robi. Konstruktor domyślny, kopiujący i inne... Z koleii destrukor usuwa coś czego nie ma (błąd murowany)!

Drugie. Pole statyczne przechowyjące rozmiar tablicy V! To wszystkie obiekty klasy Vec mają posiadać tego samego rozmiaru tablice? I dlaczego ten rozmiar zmniejszasz w momencie usuwania obiektu? Mogą istnieć jeszcze inne.

I operator+ (arytmetyczny).

Vec Vec::operator+(const Vec &b) const
{
Vec wynik;
//...
wynik[i] = this->V[i] + b.V[i];
}

return wynik;
}

W twoim wydaniu przypisanie do zmienne wynik wymaga przeładowania operatora[] na rzecz klasy Vec. Jak to zrobić?

double& operator[](unsigned indeks)
{
    if(indeks >= n)
        //rzuca błąd
   return V[indeks];
}

Dla obiektu wynik konstruktor domyślny nie wystarczy (chyba, że wszystkie obiekty klasy Vec będą tego samego rozmiaru; dlatego statyczne n?). Jego wewnętrzna tablica musi mieć odpowiedni rozmiar (większego z dwóch dodawanych obiektów). Różnice rozmiaru muszisz też uwzględnić w przebiegu pętli sumującej zawartość elementów.

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