Klasy i Obiekty.

0

Witam.

Zalozmy ze posiadam dwa obiekty ktore sa instancjami tej samej klasy.
Nazwe te obiekty A, B.

Mam tez funckje Interp(); ktorej zadanie polega na wyswietleniu wartosci pol danego obiektu.

Czyli jak napisze tak:

A.dlugosc=5;
A.Interp();

to dostane na ekranie "5".

Zdefiniowalem dla tej klasy operatory + i -.

Wiec jak napisze:

(A+B).Interp();

To otrzymam jakis tam wynik.
Moje pytanie brzmi, czy moge pobrac z klawiatury jakis ciag znakow na przyklad:
"A+B+A-B" przypisac go do zmmiennej i podstawic w miejsce (A+B) ?

Po takim podstawieniu mialbym:

(A+B+A-B).Interp();

Z gory dziekuje za odpowiedz,

Wodzu

0

Nie. I cale szczescie, ze nie mozna. Wiesz jaka to bylaby dziura?! A jakby uzytkownik wpisal: 'A, system("format c:")'?

C/C++ to nie PHP! :[

0

Oczywiscie ze to sie da zrobic na przyklad za pomoca drzewa...

problem w tym ze nigdzie ni moge znalezc przykladu...

0

Oczywiscie ze to sie da zrobic na przyklad za pomoca drzewa...

Ok. Zle Cie zrozumialem. Oczywiscie mozna wczytac wyrazenie z klawiatury,
wpuscic je na tokenizer, nastepnie zbudowac z tego drzewo skladniowe i ostatecznie
policzyc wartosc. Jednak do tego to musisz sobie caly interpreter napisac - nie ma lekko.
Myslalem, ze chodzi Ci o gotowy mechanizm w samym jezyku C++. No wiec w jezyku takiego
mechanizmu nie ma, taki mechanizm maja tylko platformy wyposazone w interpreter np. PHP albo .NET. Wielu ludzi o to pyta,
wiec moze jak dobrze na Googlu poszukasz, to moze znajdziesz gotowy
interpreter. Ja moge podrzucic Ci jedynie cos podobnego ale dla Delphi (jakies 5 tys. linii kodu).

0

Czesc:)

Dzieki za kod w Delphi, jak bede tego potzrebowal to na pewno sie zglosze.

Na grupie dyskusyjnej kolega podal mi taki przyklad:

#v+
#include <map>
#include <iostream>

class Obiekt {
   int a;
public:
   Obiekt(int _a=0):a(_a) {
   }

   int Interp() const {
      return a;
   }

   Obiekt& operator+(const Obiekt& o) {
      a+=o.a;
      return *this;
   };
};

std::map<std::string,Obiekt> zmienne;

Obiekt oblicz(const std::string &wyrazenie) {
   Obiekt wynik;
   char op=0;

   for(int i=0;i<wyrazenie.size();++i) switch(wyrazenie[i]) {
      case '+': op='+'; break;
      case '-': op='-'; break;
      default:
         switch(op) {
            case '+': wynik+=zmienne[wyrazenie[i]]; break;
            case '-': wynik-=zmienne[wyrazenie[i]]; break;
            default: wynik=zmienne[wyrazenie[i]]; break;
         }
   };

   return wynik;
};

int main() {
   zmienne["A"]=Obiekt(1);
   zmienne["B"]=Obiekt(2);
   std::cout << oblicz("A+B-A+B").Interp() << std::endl;
};
#v-

NIestety moj borland c 3.1 ma problemy ze skompilowaniem tego.
Nieznana dyrektywa +v i nie posiada takiego pliku map.h.

Moze Ty wiesz skad go zdobyc? Szukalem na necie ale jest duuuzo wersji.

Pzodrawiam,

Wodzu

0

#+v pewnie mozna olac, bo to jakies rozszerzenie Borlanda, a map.h jest na pewno w darmowym BC++ 5.5, GCC, czy nie-darmowym VC++. Wersja 3.1, ktora masz jest niestety b. stara i dlatego w ogole sugeruje Ci przesiadke na cos nowszego.

0

Tak tez bym uczynil ale tylko z takie kompilatora moglem korzystac na uczelni :-/

Dzieki za pomoc,

Pozdrawiam,

Wodzu

0

Czesc:)

Dzieki za kod w Delphi, jak bede tego potzrebowal to na pewno sie zglosze.

Na grupie dyskusyjnej kolega podal mi taki przyklad:

#v+
#include <map>
#include <iostream>

class Obiekt {
   int a;
public:
   Obiekt(int _a=0):a(_a) {
   }

   int Interp() const {
      return a;
   }

   Obiekt& operator+(const Obiekt& o) {
      a+=o.a;
      return *this;
   };
};

std::map<std::string,Obiekt> zmienne;

Obiekt oblicz(const std::string &wyrazenie) {
   Obiekt wynik;
   char op=0;

   for(int i=0;i<wyrazenie.size();++i) switch(wyrazenie[i]) {
      case '+': op='+'; break;
      case '-': op='-'; break;
      default:
         switch(op) {
            case '+': wynik+=zmienne[wyrazenie[i]]; break;
            case '-': wynik-=zmienne[wyrazenie[i]]; break;
            default: wynik=zmienne[wyrazenie[i]]; break;
         }
   };

   return wynik;
};

int main() {
   zmienne["A"]=Obiekt(1);
   zmienne["B"]=Obiekt(2);
   std::cout << oblicz("A+B-A+B").Interp() << std::endl;
};
#v-

NIestety moj borland c 3.1 ma problemy ze skompilowaniem tego.
Nieznana dyrektywa +v i nie posiada takiego pliku map.h.

Moze Ty wiesz skad go zdobyc? Szukalem na necie ale jest duuuzo wersji.

Pzodrawiam,

Wodzu

Zerknałem do kodu i taka mała uwaga, w deklaracji
std::map<std::string,Obiekt> zmienne;
jest bład, ponieważ w klasie Obiekt akcesor jest typu int, a nie string, kluczem w kontenerze map powinien byc int, a nie string, czyli :
std::map<std::int,Obiekt> zmienne;

0

Mała korekta, nie usunąłem std:: :)
std::map<int,Obiekt> zmienne;

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