[C++] Klasa-przypisanie wartości z funkcji

Awatar użytkownika
alchem
Użytkownik
Użytkownik
Posty: 252
Rejestracja: 10 cze 2014, o 19:10
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 83 razy
Pomógł: 5 razy

[C++] Klasa-przypisanie wartości z funkcji

Post autor: alchem »

Mam takie zadanie:
Napisz strukturę (klasę) Rectangle reprezentującą prostokąt o bokach równoległych do osi współrzędnych. Wyposaż ją w konstruktor przyjmujący współrzędne dwóch punktów będących dowolnymi przeciwległymi wierzchołkami prostokąta, metody X1, Y1, X2, Y2 pozwalające odczytać współrzędne (X1 to współrzędna x lewego dolnego wierzchołka itd.), metodę Area obliczającą pole prostokąta, metodę Intersects sprawdzającą czy prostokąt ma część wspólną z innym prostokątem i metodę Intersection, zwracającą prostokąt będący częścią wspólną prostokątów. Testy do przejścia i do uzupełnienia:

Kod: Zaznacz cały

void testRectangle(void)
  {
  Rectangle r1(1.0,1.0,2.0,2.0);
  Rectangle r2(3.0,3.0,4.0,4.0);
  Rectangle r3(1.5,1.5,2.5,2.5);
  assert(r1.Area()==1);
  assert(!r1.Intersects(r2));
  assert(r1.Intersects(r3));
  Rectangle r4 = r1.Intersection(r3);
  assert(r4.X1()==1.5);               // ok, 1.5 ma scisla reprezentacje zmiennoprzecinkowa
  assert(r4.Y1()==1.5);
  assert(r4.X2()==2.0);
  assert(r4.Y2()==2.0);
  }
Jednak, mam problem z 9 linią testów, jak mam do nowo utworzonej zmiennej przypisać 4 wartości, które zwraca funkcja?
Klasa wygląda tak:

Kod: Zaznacz cały

class Rectangle
{
 int x1_;
 int y1_;
 int x2_;
 int y2_;

 public:

 Rectangle(double ,double ,double ,double);

 double Area();
 double X1();
 double Y1();
 double X2();
 double Y2();

 bool Intersects(Rectangle a);

 double Intersection (Rectangle a);

};
Pomoże ktoś?
M Maciejewski
Użytkownik
Użytkownik
Posty: 318
Rejestracja: 14 maja 2016, o 16:25
Płeć: Mężczyzna
Lokalizacja: Toruń
Pomógł: 90 razy

[C++] Klasa-przypisanie wartości z funkcji

Post autor: M Maciejewski »

Problem jest taki, że metoda Intersection nie powinna zwracać wartości double, ale wartość Rectangle.
Wyznacz prostokąt, który jest ,,przecięciem" dwóch prostokątów, stwórz obiekt typu Rectangle i niech funkcja go zwróci.
Awatar użytkownika
alchem
Użytkownik
Użytkownik
Posty: 252
Rejestracja: 10 cze 2014, o 19:10
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 83 razy
Pomógł: 5 razy

[C++] Klasa-przypisanie wartości z funkcji

Post autor: alchem »

Tak, wiem, że to nie będzie typ double, napisałem tak, kiedy robiłem szkic programu i nie zmieniałem tego.
teraz mam takie coś (jest to inne zadanie, ale podobny problem)

Kod: Zaznacz cały

Data PESEL::DataUrodzenia()
{
   Data d; // tworze zmienną d typu Data
   d.rok_= atoi(numer_.substr(0,2).c_str());
   d.miesiac_= atoi(numer_.substr(2,2).c_str());
   d.dzien_= atoi(numer_.substr(4,2).c_str());                               //przypisuje jej wartosci
   std::cout<<d.dzien_<<"."<<d.miesiac_<<"."<<d.rok_<<std::endl; //spr co jej przypisało
   return d;

}
Tutaj chce zrobić że zwracam coś typu Data
W poleceniu jest tak:
DataUrodzenia zwracającą datę urodzenia zakodowaną w numerze, jako obiekt typu Data
I tutaj jest jak mówisz stwarzam obiekt typu Data i go zwracam, ale nie wiem go przypisać do jakieś zmiennej typu Data
np Data d = p1.DataUrodzenia()
M Maciejewski
Użytkownik
Użytkownik
Posty: 318
Rejestracja: 14 maja 2016, o 16:25
Płeć: Mężczyzna
Lokalizacja: Toruń
Pomógł: 90 razy

[C++] Klasa-przypisanie wartości z funkcji

Post autor: M Maciejewski »

Jak rozumiem, rozwiązujesz konkretne zadanie domowe. Jeśli dobrze rozumiem polecenie, masz po prostu stworzyć metodę, która coś zwraca. Nie musisz potem do niczego przypisywać. Tutaj też masz odpowiedni test do przejścia? Przechodzi Twój kod?
Awatar użytkownika
alchem
Użytkownik
Użytkownik
Posty: 252
Rejestracja: 10 cze 2014, o 19:10
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 83 razy
Pomógł: 5 razy

[C++] Klasa-przypisanie wartości z funkcji

Post autor: alchem »

Tak, muszę wszystkie funkcje przetestować, ale problem jest też taki, że nie wiem jak to przyrównać w teście, tzn:

Kod: Zaznacz cały

assert(p1.DataUrodzenia()==.....);
M Maciejewski pisze: Nie musisz potem do niczego przypisywać.
W tym zadaniu gdzie już napisałem tą funkcje to nie, ale tutaj chyba tak:

Kod: Zaznacz cały

  Rectangle r4 = r1.Intersection(r3); //i tu funkcja Intersection zwraca 4 współrzędne(2pkt)
  assert(r4.X1()==1.5);               // ok, 1.5 ma scisla reprezentacje zmiennoprzecinkowa
  assert(r4.Y1()==1.5);
  assert(r4.X2()==2.0);
  assert(r4.Y2()==2.0);
-- 2 cze 2016, o 15:42 --Dobra, mam to ale wyskakuje mi:
extended initializer lists only available with -std=c++11 or -std=gnu++11|

Więc musi być pewnie inny, bardziej globalny(jeśli tak można o tym mówić ) sposób aby to zwrócić.

Kod: Zaznacz cały

 Rectangle Rectangle::Intersection(Rectangle a)
 {
   double tab1[4]={x1_, x2_, a.x1_, a.x2_};
   double tab2[4]={y1_, y2_, a.y1_, a.y2_};
   sortowanie_babelkowe(tab1,4);   //
   sortowanie_babelkowe(tab2,4);  //sortuje rosnaco.
   double xx1 = tab1[1];                       // xx1 <xx2 i yy1 < yy2
   double yy1 = tab2[1];
   double xx2 = tab1[2];
   double yy2 = tab2[2];

   return  {xx1,yy1,xx2,yy2};
 }
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10225
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

[C++] Klasa-przypisanie wartości z funkcji

Post autor: Dasio11 »

Wystarczy napisać return Rectangle( xx1, yy1, xx2, yy2 ); - tylko upewnij się, że konstruktor
Rectangle( double, double, double, double ); przyjmuje współrzędne w tej kolejności.

A przy okazji, algorytm na część wspólną zwraca niepoprawny wynik, jeśli prostokąty się nie przecinają (choć nie wiem, co wtedy miałoby być poprawnym wynikiem).
Awatar użytkownika
alchem
Użytkownik
Użytkownik
Posty: 252
Rejestracja: 10 cze 2014, o 19:10
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 83 razy
Pomógł: 5 razy

[C++] Klasa-przypisanie wartości z funkcji

Post autor: alchem »

Mam funkcję, która to sprawdza, więc pewnie można ją tu umieścić w if() i podać co ma wtedy zrobić.
ODPOWIEDZ