[C++]Koncepcja programowania obiektowego

0

Witam, ucze sie C++ od kilku dni ale znam juz PHP (strukturalny) wiec skladnia obca mi nie jest. Tu moje pytanie. Czy ponizszy kod w (pseudo) obiektowym jest poprawny? Jaki jest sens rozbijania kodu na funkcje skoro mozna napisac to krocej bez rozbijania? Ponizszy program ma wyswietlac wart. bezwzgledna z liczby

[code]
#include <iostream.h>
#include <string.h>
using namespace std; //po tej deklaracji nie musisz pisać std::

class wb {
public:
float wynik,liczba;
void podaj_liczbe();
void bezwzgledna();
};

void wb::podaj_liczbe() {
cout<<"Podaj liczbe ";
cin>>liczba;
};

void wb::bezwzgledna() {
if(liczba<0) {
wynik=liczba*(-1);
cout<<"Wynik to "<<wynik;
} else if(liczba>=0) {
wynik=liczba;
cout<<"Wynik to "<<wynik;
} else {
cout<<"\n To nie liczba"<<endl;
}
};

main() {
wb obiekt;
obiekt.podaj_liczbe();
obiekt.bezwzgledna();
cout<<"\n";
system("PAUSE");
};
[/code]

0

Taki kod nie ma sensu.
Załóżmy, że jakiś programista piszący aplikację okienkową stanie przed problemem wyznaczenia wartości bezwzględnej z liczby. Pierwsze co zrobi, to poszuka odpowiedniej klasy, która to zrobi ( :P ). Znajdzie twoją, spróbuje ją zaimplementować i ... zonk. Twoja klasa WartoscBezwzgledna, która powinna wyznaczać wartość bezwzględną liczby próbuje coś pisać "w konsoli".
Ostatecznie twoją klasę możesz używać tylko ty, i tylko w tym jednym programie. Więc jest bezużyteczna, bo można było napisać to krócej strukturalnie.

Wywal wszystkie cin i cout ze swojej klasy. Niech wygląda mniej więcej tak:

class WartoscBezwzgledna
{
    int liczba;
    
public:
    void podajLiczbe( int liczba );
    int pobierzWartoscBezwzgledna();
}

//...

int main()
{
    int a;  
    WartoscBezwzgledna mojObiekt;

    cout << "Podaj liczbe: ";
    cin >> a;

    mojObiekt.podajLiczbe( a );

    cout << "Wartosc bezwzgledna z: " << a << " to: " << mojObiekt.pobierzWartoscBezwzgledna() << endl;


    return 0;
}
0

a czy poprawny jest taki skrypt?

#include <iostream.h>
#include <string.h>
using namespace std; //po tej deklaracji nie musisz pisać std::

class wartosc {
	float a,wynik;
	public:
		void wartosc_bezwzgledna(float a);	
};

void wartosc::wartosc_bezwzgledna(float a) {
	if(a<0) {
		wynik=a*(-1);
	} else {
		wynik=a;
	};
	cout<<wynik;
};

main() {
	float zmienna;
	cout<<"Podaj liczbe ";
	cin>>zmienna;
	
	wartosc obiekt;
	cout<<"Wynik to ";
	obiekt.wartosc_bezwzgledna(zmienna);
	
	cout<<"\n";
	system("PAUSE");
};

wzialem pod uwage twoje rady (przynajmniej te ktore zrozumialem)

0

w definicji klasy nie umieszczaj żadnego cout

0

ale musze jakos ten wynik wyswietlic

0

Wyswietlasz poza klasa, po co ograniczac ja do jednego programu?? Wystarczy zeby metody zwracaly wyliczone wartosci do obiektu cout. Tresc metody wartosc bezwzgledna mozna spokojne zastapic:

  return a < 0 ? -a : a;

Po co sie bawic w if'y.

0

OK.

To na czym polega roznica miedzy klasami a zwyklymi funkcjami w tym przypadku?. Bo przeciez moglbym teraz napisac funkcje ktora by mi liczyla wart bezwzgledna wstawiajac zmienna z cin za atrybut funkcji i dostalbym to samo krocej zapisane

0
MateuszSc napisał(a)

To na czym polega roznica miedzy klasami a zwyklymi funkcjami w tym przypadku?. Bo przeciez moglbym teraz napisac funkcje ktora by mi liczyla wart bezwzgledna wstawiajac zmienna z cin za atrybut funkcji i dostalbym to samo krocej zapisane

Bo to zbyt prosty problem, żeby używać klas.

0

Dziekuje za odpowiedzi.
Piszac swoje zalosne pseudo programy w "obiektowym" kierowalem sie bardzo fajnym programem
z pewnej strony z kursem. Oto ten program

http://wklej.org/id/171915/

wszystko jakby skopiowalem z tego programu. Czy powyzszego programu z linka nie dalo by sie napisac na samych funkcjach? na czym polega tutaj koncepcja programowania obiektowego?

0

Profesjonalnie to by było

template <class OutputPolicy, class InputPolicy>
class WB : public OutputPolicy, public InputPolicy {
...
}

OutputPolicy ma metodę o nazwie np. output, a input o np. input. Wtedy można wypisać, zwrócić, itd, a klasa realizująca zadanie jest ta sama

0

nie wiem o co ci wojtek12lat chodzi ;D jak juz mowilem pragne sie nauczyc OOP dlatego tak dopytuje, nie chodzi mi o skladnie, bardziej o koncepcje, jak tu uzywac, kiedy, jak to rozumiec, bo ciagle "mysle w sposob proceduralny". pozdrawiam

0

Wojtek12lat napisal ci jak mozesz wyswietlac dane klasy twoim sposobem jakby to nazwac "cout we wnetrzu klasy". Co do twojej nauki OOP to proponuje Wikipedie i Googla. - znajdziesz wszystko czego chcesz. Przy malych problemach jak ten z wartoscia bezwzgledna nie oplaca sie uzywac tutaj OOP. Programowanie obiektowe przydaje sie przy duzych, rozbudowanych projektach przykladowo "Edytor tekstu". O wiele latwiej to zaprojektowac gdyz mozna wydzielic klasy: Dokument, Akapit, Slowo, KorektorPisowni itp. tutaj klasy reprezentuja kolejne elementy edytora. Trudniej bylo by to zaimplementowac proceduralnie bo trzeba stworzyc struktury Dokument itd a dla niego konkretne metody WprowadzTekst, UsunTekst itp. Jak widac proceduralnie dane i funkcje sa czyms rozdzielnym. W OOP klasa jest caloscia opisuje "Co ma przechowywac" i "Co ma robic" a jednoczesnie "Jak ma to robic".

pozdro

0

xmoon, super dzieki, wlasnie o takie cos mi chodzilo, teraz juz wiem mniej wiecej jak moze byc zbudowany taki edytor tekstu. Ale mam jeszcze kilka pytań.

Co do mojej nauki, wlasnie dzieki Google znalazlem to forum ;] Dodam ze znam proceduralny PHP ale tam tez ciezko sie OOP nauczyc bo to przeciez pomijajac niektore elementy zapisu, to to samo.

Szukalem po googlach programow pisanych obiektowo (skryptow) z dokladnym opisaniem co co tam robi. Niestety tutoriale PL w necie, które juz chyba wszystkie obcykałem, zaczynaja sie jak zwykle

"Obiektem moze byc np jablko, a atrybutami (zmiennymi) np. kolor, smak, wielkosc" itd - ja to rozumiem, ale np. co jest obiektem/klasa w takim edytorze tekstu? Xmoon mi to pokrótce wyjasnil, jednak moze sie dorzuciie, szkoda taka wiedze zatrzymywac tylko dla siebie.

Pozdrawiam i dziekuje.

0

W oprogramowaniu obiektowym klasy najczesciej reprezentuja pojecia dziedzinowe te ktore sa rozumiane przez klienta(ktory chce miec takie oprogramowanie) i przez projektanta(opisuje niezbedne wymagania systemu). Wracajac do Edytora tekstu tutaj takimi pojeciami bedzie np. Dokument, doswiadczony projektant od razu wie ze jest to kluczowa klasa w calym systemie. Dokument taki bedzie przechowywal akapity, te z kolei zdania, a te slowa, no i jeszcze te litery(tak to mozna podzielic jesli nam potrzeba). Dokument moze przechowywac oprocz tekstu grafike i inne obiekty np wykresy. Widac wiec ze ta klasa jest jakby Jadrem aplikacji, zaczynamy zdawac sobie sprawe z tego jaki jest wazny. Co do operacji to dokument powinien dac sie zapisac, odczytac, wstawiac, usuwac, kopiowac, wklejac tekst - cala kolekcja operacji. Projektanci oprogramowania tak wlasnie patrza na "pojecia dziedzinowe", tworza odpowiednich kandydatow, rozdzielaja ich, lacza, wiedza co kazdy ma robic i jaka role pelni w aplikacji. Pomocnym narzedziem przy projektowaniu sa wzorce projektowe(byc moze spotkales takie cos) ktore opisuja rozwiazanie najczestszych problemow. Proponuje ci zapoznac sie z podstawami OOP - hermetyzacja, dziedziczenie, polimorfizm, abstrakcja itp. a pozniej poczytaj o OOD a docenisz potege tego paradygmatu programowania.

0

Dzieki za odpowiedz. A mozesz polecic jakis konkretny tekst warty uwagi? Jak Ty sie uczyles OOP i wy wszyscy ktorzy go znacie? Bycmoze podazajac za waszymi wskazowkami uda mi sie cokolwiek napisac co nie wywala sterty errorow i nadaje sie na przyklad obiektowej aplikacji. Tez tak mieliscie ze jak przeczytaliscie jakis artykul o OOP to dochodziliscie do takiego momentu ze mowicie "po co" "dlaczego" "po co jakis konstruktor, destruktor" itd...

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