Dziedziczenie (wielobazowe)

0

Witam. Jestem nowicjuszem jeżeli chodzi o język C++, dlatego proszę o pomoc. Potrzebuję stworzyć program, który sprawdzi czy 4 punkty tworzące dwie proste są do siebie prostopadłe.

Oto kawałek kodu, który udało mi się napisać:

#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

class PUNKT
{
public:
int x,y,x1,y1,x2,y2,x3,y3;
PUNKT(int, int, int, int, int, int, int, int);
void wyswietl();
};

PUNKT::PUNKT(int a, int b, int a1, int b1, int a2, int b2, int a3, int b3)
{
this -> x=a;
this -> y=b;
this -> x1=a1;
this -> y1=b1;
this -> x2=a2;
this -> y2=b2;
this -> x3=a3;
this -> y3=b3;
}

void PUNKT::wyswietl()
{
gotoxy(x,y);
cout << "*";
gotoxy(x1,y1);
cout << "*";
gotoxy(x2,y2);
cout << "*";
gotoxy(x3,y3);
cout << "*";
}

class PR: public PUNKT
{
public:
int m, m1;
int prost();
};

void PR::prost();
{
m=(y1-y)/(x1-x);
m1=(y3-y2)/(x3-x2);
if((m-m1)==(-1))
cout << "tak";
}

void main()
{
int x,y,x1,y1,x2,y2,x3,y3;
cout << "x= ";
cin >> x;
cout << "y= ";
cin >> y;
cout << "x1= ";
cin >> x1;
cout << "y1= ";
cin >> y1;
cout << "x2= ";
cin >> x2;
cout << "y2= ";
cin >> y2;
cout << "x3= ";
cin >> x3;
cout << "y3= ";
cin >> y3;
clrscr();

PUNKT P(x,y,x1,y1,x2,y2,x3,y3);
P.wyswietl();
}

Proszę o wskazówki, nie rozwiązanie.

0

Z czym masz problem ? Ja tu widzę tylko 2 klasy - bazową i potomną. O ile pamiętam, to dziedziczenie wielobazowe polega na tym, że klasa potomna ma kilka klas bazowych, więc nie wiem skąd ten tytuł. Poza tym to się nadaje do działu Newbie.

Przy dyrektywach preprocesora powinien być #, a nie "liczby całkowite z kropką".

0

Po prostu nie wiem jak skleić ze sobą te dwie klasy. Przy kompilacji wyrzuca mi błędy.

0

Kolejna podpowiedź nie napisałeś jakiej przestrzeni nazw używasz, np.

using namespace std;

Nie masz też zadeklarowanej i zdefiniowanej funkcji gotoxy(). Zgodnie ze standardem main() nie może być void, musi zwracać wartość typu int, jeśli program wykona się poprawnie, to ta wartość wynosi zero. W conio.h nie ma (z tego co pamiętam) funkcji clrscr(), możesz użyć system("cls"), ale nie będzie to do końca eleganckie, bo pod Linuxem nie zadziała. Polecenie powłoki służące do czyszczenia ekranu w Linuxie to clear.

0
 
class PR: public PUNKT
{
public:
    int m, m1;
    int prost();
};

void PR::prost();
{
    m=(y1-y)/(x1-x);
    m1=(y3-y2)/(x3-x2);
    if((m-m1)==(-1))
    cout << "tak";
}

Jak się domyślam funkcja prost() chcesz to sprawdzić, ale w ogolę jej nie wywołujesz. Zrezygnuj z kasy PR, a funkcje sprawdzająca dodaj do PUNKT bądź zdefiniuj ja publicznie.

0

cichociemny w jakim momencie tego użyć? gotoxy wg. mnie działa poprawnie, sprawdzałem bez klasy PR. Bumcykowy w ćwiczeniu wyraźnie jest zaznaczone, że klasa PR musi istnieć. Problem chyba na tym polega.

1

w ogóle klasy są do d**y porobione
od kiedy to "punkt" jest wektorem 8 zmiennych?
do konstruktora punktu możesz co najwyżej dać dwie zmienne (jeśli to ma być punkt w przestrzeni 2D) lub ew. trzy (w 3D)
dopiero klasa "linia" / "prosta" mogłaby za konstruktor przyjmować dwa punkty

klasa "pr" w ogóle nie wiem czym ma być
nie widzę tu też żadnej okazji do użycia dziedziczenia

brnąc dalej - punkt nie powinien mieć metody "wyswietl"
za to powinna być odpowiedzialna osobna klasa będąca kontrolerem ekranu i przyjmująca w parametrze współrzędne punktu

nadal nie napisałeś jakie błędy wyskakują i z czym konkretnie masz problem skoro nie chcesz gotowego rozwiązania

0

Klasa PR ma sprawdzać czy proste stworzone przez te punkty są do siebie prostopadłe. Przepraszam za błędy.

0

Źle spojrzałem, to pewnie przez to ze nie wkleiłeś sformatowanego kodu. Utwórz obiekt PR a nie PUNKT, i wywołaj metodę prost() tam gdzie tego potrzebujesz, bo aktualnie jest nie używana.

0

Aż dziw, że nikt jeszcze tego nie napisał. Wywal ten cały kod, bo jest całkowicie zły.
Punkt, z tego co wiem ma dwie współrzędne, a nie 8 (chyba, że nie rozmawiamy o przestrzeni 2d tylko 8d).
Prosta w żadnym wypadku nie jest szczególnym przypadkiem czy typem punktu, więc dziedziczenie tu się po prostu do tego nie nadaje, powinna tu być kompozycja.
Mniej więcej tak:

class Punkt
{
public:
  int x;
  int y;

  Punkt(...){...}
};

class Prosta
{
  Punkt a;
  Punkt b;

public:
  Prosta(...){...}
  bool JestProstopadlaDo(const Prosta &p){...}
};

//edit: jednak unikalna_nazwa mnie ubiegł

0

i musisz tu użyć dziedziczenia?
żeby sprawdzić czy proste są prostopadłe sprawdzasz czy iloczyn współczynników kierunkowych jest równy -1
u Ciebie widzę odejmowanie więc może o to Ci chodzi?

0
Ardian49 napisał(a)

cichociemny w jakim momencie tego użyć? gotoxy wg. mnie działa poprawnie, sprawdzałem bez klasy PR.

Cuda niewidy - niezadeklarowana i niezdefiniowana funkcja DZIAŁA. Odsyłam do lektury http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Funkcje-pierwsze-starcie/291

0

Źle sprawdzasz prostopadłość: użyłeś dzielenia całkowitego zamiast zmiennoprzecinkowego, nie zabezpieczyłeś się przed dzieleniem przez zero, nie bierzesz pod uwagę błędów zaokrągleń.

Prostopadłość łatwo sprawdzisz przy użyciu iloczynu skalarnego (jego wartość wynosi 0 jeśli wektory są ortogonalne):

/* sprawdzamy prostopadłość prostej przechodzącej przez punkty (x1, y1) i (x2, y2)
 * oraz prostej przechodzącej przez punkty (x3, y3) i (x4, y4) */
int ux = x2 - x1;
int uy = y2 - y1;
int vx = x4 - x3;
int vy = y4 - y3;
return
    (ux != 0 || uy != 0) &&
    (vx != 0 || vy != 0) &&
    ux * vx + uy * vy == 0; // iloczyn skalarny
0
cichociemny napisał(a)
Ardian49 napisał(a)

cichociemny w jakim momencie tego użyć? gotoxy wg. mnie działa poprawnie, sprawdzałem bez klasy PR.

Cuda niewidy - niezadeklarowana i niezdefiniowana funkcja DZIAŁA. Odsyłam do lektury http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Funkcje-pierwsze-starcie/291

Z innego forum

Jeżeli ściągniesz nagłówek conio2.h, uzyskasz możliwość stosowania gotoxy(), clrscr i wiele innych fcji niedostępnych w conio.h. Aby z niego korzystać, w opcjach kompilatora dodaj
-lconio

0

Błędy:

  1. Class member 'PR::prost()' declared outside its class
  2. 'PR::prost()' is not member of 'PR'
  3. Declaration terminated incorrectly

Mój problem:
Stworzyć klasę podrzędną, w której sprawdzę czy 4 punkty (a zatem 2 proste) są do siebie prostopadłe. Kompletnie nie wiem jak się do tego zabrać. Proszę o jakiś przykładowy program, bądź gotowy algorytm. Na dzisiaj kończę pisanie.

0
Ardian49 napisał(a)

Błędy:

  1. Class member 'PR::prost()' declared outside its class
  2. 'PR::prost()' is not member of 'PR'
  3. Declaration terminated incorrectly
int prost();
};

void PR::prost();

widzisz tu jakieś różnice?

0

Dopisz sobie jedna funkcje.

#include <iostream>
using namespace std;
//******************************************************************************
struct Punkt
{
     int x, y;
     //--
     Punkt(int x_ = 100, int y_ = 100) : x(x_), y(y_) { }
};
//******************
ostream &operator<<(ostream &out, const Punkt &p)
{
    out << p.x << " " << p.y << endl;
    return out;
}
//**************************************
class Proste
{
protected:
    Punkt Pierwsza[2]; //poprawione
    Punkt Druga[2];
public:
    Proste(Punkt x1, Punkt y1, Punkt x2, Punkt y2)
    {
        Pierwsza[0] = x1;
        Pierwsza[1] = y1;
        Druga[0] = x2;
        Druga[1] = y2;
    }
    //--
    void DodajPierwszaProsta(Punkt p1, Punkt p2)
    {
        Pierwsza[0] = p1;
        Pierwsza[1] = p2;
    }
    //--
    void DodajDrugaProsta(Punkt p1, Punkt p2)
    {
        Druga[0] = p1;
        Druga[1] = p2;
    }
};
//**************************************
class CzyProstopadle : public Proste
{
public:
    CzyProstopadle(Punkt x1, Punkt y1, Punkt x2, Punkt y2)
        : Proste(x1, y1, x2, y2) {}
    //--
    void Sprawdz() //Czy prostopadle
    {
        //tutaj dokonaj obliczen dla tablic
        //nie musisz ich przesylac
    }
};
//******************************************************************************
int main()
{
    
}
 
0

Oj nie dobrze, nie dobrze. Trochę lepiej ale dalej nie dobrze.
Klasa Prosta powinna reprezentować jedną prostą a nie dwie.
Tablice jednoelementowe, a wpisujesz dwa elementy...
Klasa CzyProstopadla w ogóle bez sensu, jej istnienie jak i to, że dziedziczy po Prosta.

Tak ogólnie to w tym zadaniu widzę potrzebę istnienia tylko jednej klasy - klasy Punkt która reprezentuje punkt (para współrzędnych).

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