dziedziczenie wielobazowe

0

Potrzebuję pomocy przy programie wykorzystującym dziedziczenie wielobazowe. Program ma działać podobnie jak jest to przedstawione na schemacie:

user image

Orłem z programowania nie jestem, więc proszę o wyrozumiałość. Tu wklejam swój kod. Niestety ale nie ustrzegłem się błędów:

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

class Point
{
    protected:
	   int x, y;
	public:
	   Point (int ax, int ay)
       {
           x = ax,
		   y = ay;
	   }
	   virtual void show()
	   {
           cout << "(" << x << ", " << y << ")" << endl;
       }
       void print()
       {
           show();
       }
};

class Text: public Point
{
    protected:
	   char text[10];
	public:
	   Text(char *atext, int atx, int aty): Point (atx, aty)
       {
           strcpy (text, atext);
       }
       void show()
       {
           cout << text;
       }
       void print()
       {
           show();
       }
};

class TwoPoints: public Point
{
    protected:
	   int x1, y1;
	public:
	   TwoPoints (int ax, int ay, int ax1, int axy): Point(ax, ay)
	   {
           x1 = ax1,
		   y1 = ay1;
       }
       void show()
       {
           cout << "(" << x << ", " << y << "), (" << x1 << ", " << y1 << ")" << endl;
       }
};

class Rectangle: public TwoPoints
{
    public:
	   Rectangle(int ax, int ay, int ax1, int ay1): TwoPoints(ax, ay, ax1, ay1)
	   {
       }
       void show()
       {
           cout << "(" << x << ", " << y << "), (" << x1 << ", " << y1 << ")" << endl;
       }
};

class RectangleText: public Rectangle, public Text
{
    public:
	   RectangleText(int ax, int ay, int ax1, int ay1, char* tx, intatx, intaty): Rectangle (ax, ay, ax1, ay1), Text(tx, atx, aty)
	   {
       }
       void show()
       {
           cout << "(" << TwoPoints :: x << ", " << TwoPoints :: y << ")" << "(" << x1 << ", " << y1 << ")" << text << "(" << Text :: y << ")" 
		        << "(" << x1 << ", " << y1 << ")" << text << "(" << Text :: x << ", " << Text :: y << ", " << endl;
       }
};

void main ()
{
    RectangleText R (5, 5, 100, 100, "RECTANGLE", 13, -13);
    R.TwoPoints :: print();
    cout << sizeof (RectangleText);
    system("pause");
} 
0

Czy rozumiesz rysunek?
U ciebie tekst pochodzi od punktu, NIE MA tego na rysunku.

5

Program ma działać podobnie

Rozumiem że „program ma”, ale to jest bzdura, i pokazuje jak NIE należy używać dziedziczenia.

"dwa punkty" nie są szczególnym rodzajem punktu,
prostokąt nie jest szczególnym rodzajem "dwóch punktów",
"prostokąt z tekstem" może dziedziczyć po prostokącie, ale czy powinien dziedziczyć po tekście? raczej go zawierać...

Zobacz Zasada podstawienia Liskov.

0

W takim razie na studiach uczą głupot, bo właśnie w ten sposób stosowaliśmy dziedziczenie. Jakie błędy jeszcze zawiera mój program?

0

@Kamilos_91 głowe dam że to po prostu ty tego nie zrozumiałeś a nie że tak was uczyli... Cały ten schemat dziedziczenia tutaj jest bez sensu. A co jeszcze jest źle? main jest int a nie void i system("pause") to zło ;]

0

system("pause") - czemu jest niby zle?

0

Bo jest zależne od systemu to raz, a dwa wymaga ponownego wciśnięcia klawisza przez co przekierowanie wejścia jest niemożliwe. Zobacz, że nawet na windzie praktycznie nie ma programów, które by wymagały reakcji użytkownika po skończeniu działania.

2

zawsze należy rozważać kompozycję a później dziedziczenie. Bo można sobie nieźle projekt zagmatwać

0

System("pause") to szczegół, można napisać cin.get() i też będzie. Bardziej chodziłoby mi o to, dlaczego wywala mi błędy w 34, 54 i 77 linii.

Shalom napisał(a):

@Kamilos_91 głowe dam że to po prostu ty tego nie zrozumiałeś a nie że tak was uczyli... Cały ten schemat dziedziczenia tutaj jest bez sensu. A co jeszcze jest źle? main jest int a nie void i system("pause") to zło ;]

Fakt, nie do końca to rozumiem, ale zadanie zrobić trzeba :/ Wiem, że daje się int main () ale w przeszłości pisaliśmy też programy z voidem i działały. Już to poprawiłem ale dalej są błędy :(

0

@Kamilos_91
Wydaje mi się, że tego nie pisałeś. Gdybyś pisał i spojrzał na błędy to byś to poprawił w jakąś minute. Przeklejam błędy (pomijam to, że zadanie które dostałeś jest źle zrobione)

34|error: 'strcpy' was not declared in this scope|
54|error: 'ay1' was not declared in this scope|
77|error: 'intatx' has not been declared|
(...)// w 77 same takie intatxy (jeszcze ze 4)
87|error: '::main' must return 'int'|

jeżeli pisałeś sam i nie potrafisz sobie poradzić z tymi błędami to mam dla Ciebie przykrą wiadomość. Mianowicie jesteś na złych studiach.

dobre IDE samo zatrzyma konsole i nie trzeba żadnego cin.get() ani system("pause") ani innych takich.

0

Poza tym programy konsolowe powinno się odpalać w konsoli i wtedy zatrzymywanie konsoli jest niepotrzebne, a wynik programu będziesz widział.

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