Prosty program z "hermetyzacją"

0

Witam. Potrzebuje waszej pomocy. Jestem uczniem technikum informatycznego, i zaczynam uczyć się c++, wiec praktycznie nic nie wiem jeszcze.... Mam zrobić referat na temat "klasy i obiekty". W jednym podpunktcie mam zająć się "hermetyzacją"
Poszukalem jakiś program, jednak nie działa mi on poprawnie. Podczas kompilowania wyskakuje 5 błędów. Program w którym to sprawdzałem to : C++ Builder.
Jeżeli program jest całkowicie zły, to prosiłbym o napisanie jakiegos najprostszego, z funkcją hermetyzacji.
Liczę na waszą pomoc! Pozdrawiam.

#include"iostream.h"
#include"string.h"
using namespace std;
class czolg{
public:
int naboje;
string kolor;
};
int main(){
czolg rudy ;
cout<<"Podaj ilosc naboji";
cin>>rudy.naboje;
cout<<"Podaj kolor";
cin>>rudy.kolor;
cout<<"\nRudy ma "<<  rudy.naboje;
cout<<"\nRudy ma kolor "<<  rudy.kolor;
return 0;
}
0

1.Jakie błędy.
2.Naucz się formatować kod.

1

Ogólnie to tu hermetyzacji nie ma, bo pola klasy są publiczne (a to nie o to tu chodzi). Przykładowy kod z hermetyzacją może być taki:

#include <iostream>

using namespace std;

class klasa
{
    private:
    int pole1;
    string pole2;

    public:
    klasa(int _pole1, string _pole2)
    {
        pole1 = _pole1;
        pole2 = _pole2;
    }

    void resetuj()
    {
        pole1 = 0;
        pole2 = "";
    }

    void pokaz()
    {
        cout << pole1 << endl;
        cout << pole2 << endl;
    }
};

int main()
{
    klasa klasa1(123, "ala ma kota");

    klasa1.pokaz();

    return 0;
}
0

@xeo545x39 W Twoim programie wyskakuje 7 błędów, a mianowicie: http://www2.picturepush.com/photo/a/6622705/img/6622705.jpg

0

No way.. U mnie chodzi dobrze i nie możliwe żeby takie błędy były. Dorzuć jeszcze #include <string> na początku. Jakiego środowiska używasz i kompilatora??

0

C++ Builder.
Dodałem tą biblioteke, to znikły błędy, ale pojawił się jeden warunek:

[C++ Warning] string cc(686); Comparing signed and unsigned values.

0

Jeśli chcesz pokazać PO CO jest hermetyzacja, a nie jakiś bzdurny kod który jedynie ja prezentuję to proponuje coś takiego:

  • napisz jakąś klasę, powiedzmy klasę Wektor która symuluje dwuwymiarowy wektor
  • napisz tą klasę w 3 wersjach: jedna z publicznymi polami
  • jedna z prywatnymi polami i jedynie metodami pozwalajacymi na dostęp do danych
  • jedna z prywatnymi polami i jedynie metodami pozwalajacymi na dostęp do danych, ale z inną implementacją tych metod niż ta powyżej.
    I teraz zaprezentuj co by się stało gdyby ktoś postanowić dane w klasie przechowywać inaczej, np. zamiast dwóch pól
int x;
int y;

Chciałby nagle mieć:

int arr[2];

Chodzi o to żeby zaprezentować że w pierwszym przypadku próba zmiany "implementacji" wymaga zmiany kodu który z naszej klasy korzysta. W drugim i trzecim przypadku nie - my zmieniamy implementację, ale sposób używania klasy się nie zmienia (ważne w przypadku ogólnodostępnych bibliotek i kodu z którego korzysta wiele osób - kto by chciał co chwila przepisywać swoje programy bo wyszła nowa wersja biblioteki? ;) )

0

Dzięki za podpowiedź, tylko tak jak wspomniałem wyżej. Jestem całkowicie nie obeznany w tym temacie, ponieważ dopiero zaczynamy C++
Więc za dużo nie zrozumialem z tego co Ty mi napisałes :)

0

Zaczynacie C++ i od razu od programowania obiektowego?

0

No mamy troche dziwną kolejność, bo tak: przez 1 klase robilismy troche pascala... w drugiej klasie robilismy cały czas assemblera na praktycznych, a na teoretycznych przepisywanie ksiązki na temat c++... I teraz w 3 klasie robimy html oraz c++. Kazda grupa ma przygotowac referat na dany temat z c++, i ja mam temat "klasy i obiekty"
Tak wygląda sprawa :)

0

To piszesz, że zaczynacie C++, a już go mieliście w 2 klasie? Bo jeśli nie, to nie ma sensu tak tego robić - ale to wina nauczycieli i ich podejścia. Wg. mnie powinieneś ten referat skopiować z jakiejś wikipedii, bo i tak nic z niego nie będziesz rozumiał. Nie chodzi mi o obrażenie Cię, tylko o to, że jeśli nigdy wcześniej nie miałeś styczności z programowaniem zwykłym (proceduralnym) C++, to obiektowego nie zrozumiesz tak łatwo. Co z tego, że będziesz miał referat o hermetyzacji, skoro nie wiesz co to metoda wirtualna, do czego służy klasa albo czym się różni struktura od klasy? Równie dobrze można zrobić referat o programowaniu wielowątkowym nie mając pojęcia o programowaniu.

0

Zgadzam sięz Toba w 100% Nie ma co ukrywać, ale takie są fakty. Tak jak wspominałem w 2 klasie uczylismy się c++ na zasadzie, ze nauczyciel dawał nam ksiązke, i powiedział "od tąd, do tąd" macie miec przepisane.... I jeden dyktował, a wszyscy przepisywali....
To były takei wiadomości typu np: opis pojedynczych pętli, operatory, jakies algorytmy, typy danych, słowa kluczowe (bez opisywania) itp... Szkoda słów....

0

Dlatego jeśli chcesz się nauczyć programować, to zrób referat jak powiedziałem, a nauke zacznij sam we własnym zakresie. Symfonia C++ Grębosza lub Szkoła Programowania S.Prata - to chyba najlepsze tytuły na początek. Możesz też zacząć tu - http://cpp0x.pl/

0

Dzięki za rade, na pewno skorzystam. Tylko nie chciał bym też czytać o czyms, czego całkowicie nie rozumiem, a tym bardziej, jak nauczyciel zada jakies pytanie np. o jakąś linijke z programu, a ja nic nie będę wiedział.... Ogólnie wg mnie to nauczyciel powinien wszystko wytłumaczyc, a nie, ale cóż, takie są realnia Polskiej edukacji ;/

1

Ok taki prosty przykład, skoro to ma być tylko fragment referatu:
Mamy dwie klasy które mają mniej więcej to samo zastosowanie, przy czym jedna używa hermetyzacji a druga nie

class Wektor
{
  public:
    int x;
    int y;
    double length;
    Wektor(int xx, int yy):x(xx),y(yy)
    {
      length = sqrt(x*x+y*y);
    }
};

class WektorHermetyczny
{
  private:
    int x;
    int y;
    double length;
  public:
    Wektor(int xx, int yy):x(xx),y(yy)
    {
      recalculateLength();
    }
    int getX()
    {
      return x;
    }
    void setX(int newX)
    {
      x=newX;
      recalculateLength();
    }
    int gety()
    {
      return y;
    }
    void setY(int newY)
    {
      y=newY;
      recalculateLength();
    }
    double getLength()
    {
      return length;
    }
  private:
    void recalculateLength()
    {
      length = sqrt(x*x+y*y);
    }
};

I mamy przykładowe kody które korzystają z tych klas:

Wektor pierwszy(1,2);
cout<< pierwszy.x <<" "<<pierwszy.y<<" "<<pierwszy.length<<endl;
WektorHermetyczny drugi(1,2);
cout<< pierwszy.getX() <<" "<<pierwszy.getY()<<" "<<pierwszy.getLength()<<endl;

Wydaje się że w zasadzie nie ma większej różnicy. Otóż jest dość fundamentalna: pole length wynika z wewnętrznego stanu naszego obiektu (tzn z X i Y). Uzytkownik jednak moze sobie dowolnie tą wartość zmienić (nawet nieumyślnie). Co więcej, gdybyśmy postanowili ze chcemy oszczędzić na pamięci programu i zamiast przechowywać tą wartość, po prostu ją wyliczać (co pozwoliłoby nam uniknąć podanego wcześniej problemu) to znów pojawia się kłopot: musimy ten nasz przykładowy kod przepisać...
Rozwiazanie hermetyczne nie dość że pozwala nam uniknąć pierwszego problemu to pozwala nam też dokonać zmiany struktury wewnętrznej klasy bez konieczności modyfikacji kodu który z niej korzysta. Jak? Tak:

class WektorHermetyczny
{
  private:
    int x;
    int y;
  public:
    Wektor(int xx, int yy):x(xx),y(yy){}
    int getX()
    {
      return x;
    }
    void setX(int newX)
    {
      x=newX;
    }
    int gety()
    {
      return y;
    }
    void setY(int newY)
    {
      y=newY;
    }
    double getLength()
    {
      return sqrt(x*x+y*y);
    }
};

Z punktu widzenia uzytkownika NIC się nie zmieniło, mimo że dokonaliśmy dość poważnej zmiany w implementacji naszej klasy.

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