Przeciążanie operatorów

0

Otóż mam klasę Figura:

 
class Figura
{
public:
	private:
	double pole;
	double obwod;
	int licznik_bokow;
	double *tablica;

public:
	static int zlicz;
	void setBoki();
	void getBoki();
	void wyswietlObwod();
	void wyswietlPole();
	Figura();
	Figura(double r);
	~Figura();
};

Ona sobie zlicza pole i obwód przy pomocy indeksów tablicy. Teraz mam problem z zadaniem bo muszę przeładować operatory tak żeby zliczało sumy boków, ale również poprzez indeksy tablicy (i tu jest problem). Treść zadania:

Dodaj przeciążenie operatorów ”+” i ”-” tak, aby sumowały / odej-
mowały one długości boków o odpowiadających sobie indeksach ta-
blicy. W przypadku odejmowania, należy wziąć wartość
bezwzględną z długości boków, jeśli wychodzą one ujemne. Pamiętaj o
przeliczeniu obwodu i pola.

Nie wiem jak to zrobić za pomocą tych indeksów tablicy

1

Czegoś tu nie rozumiem.


```cpp public: private: ```

Po co to?


```cpp void setBoki(); ```

Na pewno ta funkcja będzie bezargumentowa?


```cpp void getBoki(); ```

Na pewno ta funkcja nic nie zwraca ani nie otrzymuje argumentów przez wskaźnik / referencję?

Tak samo

void wyswietlObwod();
void wyswietlPole();

```cpp static int zlicz; ```

Na pewno to ma być zmienna statyczna?


**Jeśli nie trzymasz kątów, to jak możesz w ogóle wyliczyć pole?**
1

Po co? Pytam się po co? Chyba tylko po to, żeby siebie życie uprzykrzyć.

Jeśli się upierasz to zacznij od napisanie tej funkcjonalności normalnie bez operatorów.
Na dodatek nadal nie masz pojęcia jak pisać metody: co metoda powinna zwracać, a co przyjmować jako argument. Jak tego najpierw nie załapiesz, to nie ma szans byś definiował prawidłowo operatory.

0
kmph napisał(a):

Czegoś tu nie rozumiem.


public:
    private:

Po co to?


racja tu błąd, ale co do reszty to spoko bo liczy wszystko, tamte paramtery sa po prostu zadane w konstruktorze a całego kodu nie wrzucałem. Nie to tutaj jest ważne tylko to jak przeciążyć operatory żeby te poszczególne elementy tablicy się sumowały

0

to co tutaj masz jest mało precyzyjne,
oni każą Ci liczyć pole jakiegoś wielokąta nieforemnego?
jak masz policzyć te sumy i różnice na wielokątach o różnej ilości boków?(wnioskuję to po polu licznik_boków)

może ta klasa to tylko interfejs, i tak naprawdę masz dopisać konkretne klasy, które mają z niego korzystać;

bez tej wiedzy ciężko będzie Ci pomóc

0

OK w takim razie wstawiam, tylko to jest wersja robocza (coś co jeszcze robię więc nie czepiać się głupot tylko jak ktoś może to proszę o pomoc)

 
class Figura
{
private:
	double pole;
	double obwod;
	int licznik_bokow;
	double *tablica;

public:
	static int zlicz;
	void setBoki();
	void getBoki();
	void wyswietlObwod();
	void wyswietlPole();
	Figura();
	Figura(double r);
	~Figura();
};
 


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

using namespace std;

void Figura::setBoki()
{
	tablica = new double[licznik_bokow];
	cout << "Podaj wartosci liczb w tablicy" << endl;
	for (int i = 0; i < licznik_bokow; i++)
		cin >> tablica[i];

	for (int i = 0; i < licznik_bokow; i++)
	{
		obwod += tablica[i];
		if (licznik_bokow == 3) 
		{
			if (tablica[0] + tablica[1]>tablica[2] && tablica[0] + tablica[2]>tablica[1] && tablica[1] + tablica[2] > tablica[0])
			{
				double p = 0.5*(tablica[0] + tablica[1] + tablica[2]); // *wzor Herona
				pole = sqrt(p*(p - tablica[0])*(p - tablica[1])*(p - tablica[2])); // *wzor Herona
			}
		}
	}
}


void Figura::getBoki()
{
		tablica = new double[licznik_bokow];
		for (int i = 0; i < licznik_bokow; i++)
			cout << tablica[i];
}

void Figura::wyswietlObwod()
{
	cout << " " << obwod << endl;
}

void Figura::wyswietlPole()
{
	cout << " " << pole << endl;
}

Figura::Figura(double r)
{
	pole = 0;
	obwod = 0;
	pole = 3.14*r*r;
	obwod = 2 * 3.14*r;
	licznik_bokow = 1;
	tablica = new double[licznik_bokow];
	tablica[0] = r;
	zlicz++;
}
Figura::Figura()
{
	pole = 1.0;
	obwod = 0.0;
	licznik_bokow = 4;
	tablica = new double[licznik_bokow];
	for (int i = 0; i < licznik_bokow; i++)
		tablica[i] = 1.0;
	zlicz++;
}


Figura::~Figura()
{
	delete[] tablica;
	zlicz--;
}

Zrobiłem zmiane dla programu tak jak było wcześniej i tutaj liczy i pole i obwód (raz dla kwadratu i raz dla koła - to akurat mało ważne). I teraz z tego potrzebuje przerobić program tak, aby liczył to co podałem w pierwszym poście, o to mi chodzi

0

ahhh... ciezko bedzie wytlumaczyc bo na poczatku to program mial po prostu miec zadane parametry w konstruktorze i obliczyc pole i obwod a teraz ma miec przeciazone operatory i dodawac odpowiednie indeksy tablicy i tego nie wiem jak zrobic to kombinuje

0

Możesz wstawić kompletną treść zadania...?

0

Dodaj przeciążenie operatorów ”+” i ”-” tak, aby sumowały / odej-
mowały one długości boków o odpowiadających sobie indeksach ta-
blicy, brakujące boki (jeśli figury mają różne ilości boków) ustaw na
wartość ”0” (zero). W przypadku odejmowania, należy wziąć wartość
bezwzględną z długości boków, jeśli wychodzą one ujemne. Pamiętaj o
przeliczeniu obwodu i pola

To jest tak, że to co wstawilem to zrobilem na poprzednich zajeciach i to jest dobrze a mnie chodzi tylko o to jak przeciazyc te operatory zeby dodawaly wartosci z odpowiednich indeksow z reszta sobie poradze

0
#include <iostream>
#include <array>

struct A
{
	std::array<double, 3> values;

	void print()
	{
		std::cout << "values: ";
		for(auto const& e : values) {
			std::cout << e << " ";
		}
		std::cout << std::endl;
	}

	friend A operator+(A lhs, A const& rhs);
};

A operator+(A lhs, A const& rhs)
{
	for(unsigned i = 0 ; i < 3 ; ++i) {
		lhs.values[i] += rhs.values[i];
	}

	return lhs;
}

int main()
{
	A a1 { { 1, 2, 3} };
	A a2 { { 9, 8, 7 } };
	A sum = a1 + a2;

	a1.print();
	a2.print();
	sum.print();

	return 0;
}

mały przykładzik: http://melpon.org/wandbox/permlink/bk7hEylCBuMofS1f

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