obsługa tablic asocjacyjnych, tworzących obiekty języka skryptowego.

0

Próbuję napisać silnik obiektowego języka skryptowego w c++. Wymyśliłem sobie, że zmienne będą w nim działać jak w javascripcie czyli będą jednocześnie zmienymi, obiektami, tablicami lub funkcjami w zależności od kontekstu użycia, będą w moim programie reprezentowane jako stringi znajdujące się w asocjacyjnych tablicach struktur. Realizuję to poprzez "map" i strukturę "Struktura".

chciałem stworzyć funkcję, która dla stringa podanego w argumencie (będącego ścieżka po obiektach np. "foo.bar.si") zwracałaby wartość tego obiektu jako string (tj wartość struktura.nast['foo'].nast['bar'].nast[si].dane).

.. a później analogiczną zapisującą.
mój kod, który daje poprawne wyniki:

 #include <iostream>
#include <map>
#include <string>

using namespace std;

//inicjacja struktury danych->drzewko
	struct Struktura 
	{
		map<string, Struktura> nast;
		string dane;
	};
	struct Struktura struktura;
//koniec inicjacji struktury
string czytaj_obiekt(string lokacja)
{
        //tutaj powinna być pętla, która iterując kawałki "lokacja" dochodziłaby do wymaganego pola
	struct Struktura tmp;
	tmp=struktura.nast["a"];//symulacja pętli dla przykładu poniżej
	tmp=tmp.nast["2"];
	lokacja=tmp.dane;
	
return lokacja;	
}

string perse(string input)
{
	string output;
	
	return output;
}
int main()
{
	struktura.nast["a"].nast["1"].dane="kot";
	struktura.nast["a"].nast["2"].dane="pies";
	cout<<czytaj_obiekt("a.2");//powinno wyświetlić "pies"
   int a;
   cin>>a;
   return a;
}

cały problem polega na tym, ze to rozwiązanie tj. funkcja czytaj_obiekt() za każdym przebiegiem pętli kopiuje całą strukturę , co przy większej ilości danych jest bardzo czasochłonne. Próbowałem robić to ze wskaźnikami, ale nic mi nie wychodziło. wie ktoś jak to rozwiązać? Acha... i czy map użyłem poprawnie oraz czym różni się multimap? Jestem kompletnym laikiem jeśli chodzi o C++, mam kupę z ANSI C przyzwyczajeń i w c++ czuję się "obco", więc nie wiem czy ten kod ma jakikolwiek sens- może można to zrealizować lepiej, ładniej i krócej?

0

jeśli nie chcesz żeby coś było kopiowane to używaj referencji np. tak: const string& lokacja. jesli chcesz zeby to nawet normalnie dzialalo to radze operowac na c-stringach, ale zaraz pewnie ktos wyskoczy z jakims rozwiazaniem ktore bedzie rownie szybko bedzie dzialac na klasach

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