Odczytywanie danych z pliku CSS - wlaściwości i wartości

0

Witajcie, próbuje napisać aplikacje(docelowo mini bibliotekę) która przetwarza plik CSS.

Ogólna koncepcja:
Próbuje stworzyć program który odczyta z pliku tesktowego np *.css, dane zapisane własnie w css-podobnym stylu.

appSettings
{
    window-size-x:640px;
    window-size-y:480px;
    windowTittle: "CollName";
}

Aplikacja wczytuje plik, szuka zadany 'selektor' odczytuje jego własciwości i ich wartości i zapisuje je w obiekcie klasy CSelektor (myślałem nad kontenerem std::map lub std::multimap) a ten umozliwia pobranie wartosci przypisanej do danej właściwości.
Kontener (wspomiany wyżej) zawiera nazwę właściwości i przyporzadkowaną jej wartość zawartą w obiekcie klasy CValue

PROBLEM:
Pobranie wartości no właśnie, tu zaczynają się schody.
Plik CSS jest plikiem tekstowym więc początkowy format danych jest znany (std::string lub (const) * char) ale nie potrafię zdecydować w jaki sposób klasa CValue ma przechowywać wartość - czy jako łańcuch znaków czy może powinna tam znajdować się wartość przekonwetowaną do właściwego typu danych.
Opcja 1: wartość przechowywana jako łańcuch znaków. (Którą wybrałem by zaimplementować)
Wymusza to istnienie funkcji konwertującej do dowolnego typu. Jak [właściwie] napisać taka funkcję/metodę ?
Jak w języku C++ sprawdzić jakiego typu jest dana zmienna (znalazłem wzmianki o

typeid(Type) 

)
Niestety to nie spełnia oczekiwań.
Opcja 2: wartość przechowywana w obiekcie klasy CValue już skonwertowana do właściwego typu.
To również rodzi komplikację gdyż potrzebna jest klasa potrafiąca przechowywać dowolny typ danych oraz zawiera pole z informacją jaki typ danych przechowuje.


Z tego wszystkiego moje pytanie: Jak to zrobić we właściwy sposób? Jakie właściwości języka należy wykorzystać (z cała pewnością funkcje/metody szablonowe i nowoczesne kontenery(map/multimap)) ?


Podaje kod.
Jest to uproszoczna klasa reprezentująca to co już mam.

PLIK: CValue.hpp

 
#ifndef VALUE_HPP_INCLUDED
#define VALUE_HPP_INCLUDED
#include <string>     // std::string, std::stoi
#include <typeinfo>
#include <typeindex>      // std::type_index

class CValue
{
      public:
          CValue();
 virtual ~CValue();

          void setValue(const std::string & _value);
          template <class Typ>Typ getAs();
      private:
          std::string * m_value; //Czy nie lepiej wykorzystać łancuch znakow z C - wieksza kontrola np nad zużyciem pamieci ?
};

template <class Type>
Type CValue::getAs ()
{
   if( m_value == nullptr || m_value->size() == 0)throw;
   if(typeid(Type) == typeid(int))return std::stoi( *m_value);//Drabinka if'ow dla kazdego typu danych ? To chyba zly pomysl. Nalezy pamietac
  ///ze typeinfo nie dziala dla std::string 

   ///......
}
#endif // VALUE_HPP_INCLUDED

PLIK: CValue.cpp

 
#include "Selector/Value/Value.hpp"

CValue::CValue()
       :m_value( nullptr )
{
    ///NOTCHING///
}
CValue::~CValue()
{
    delete m_value;
}
void CValue::setValue(const std::string & _value)
{
    m_value = new std::string(_value);
}

3

Dopóki nie nauczysz się podstaw C++ (+ jak pisać normalny kod) użyj jakiejś gotowej biblioteki.
Dobrze na tym wyjdziesz.

//EDIT (bo komentarze są ograniczone): @kacper546

  1. Jeżeli nie potrzebujesz immutable widoku, to na 99% nie powinieneś trzymać żadnego pola-wskaźnika.

  2. Nie używaj dziwnych prefiksów do nazw

  3. Nie twórz konstruktorów / destruktorów, jeśli nic nie mają robić

  4. Zapoznaj się trochę lepiej z std::string

  5. w 99% jeśli potrzebujesz użyć typeid, to robisz coś źle; tak jest w tym przypadku

  6. throw;? Trochę mało pola do popisu przy łapaniu tego wyjątku :P

  7. Drabinka ifów to zawsze cholernie złe rozwiązanie.

  8. Nie potrzebujesz wirtualnego destruktora, jeśli nie używasz dziedziczenia - twoje CValue nie powinno nawet myśleć o byciu dziedziczonym

  9. Przy twojej aktualnej "architekturze":
    http://www.boost.org/doc/libs/1_55_0/doc/html/any.html
    http://www.boost.org/doc/libs/1_58_0/libs/optional/doc/html/index.html

0

@spartanPAGE

  1. immutable - ang niezmienny - Niezmienny widok jak mam to rozumieć?

  2. Dziwnych prefiksów? Chodzi o to że pole w klasie ma przed 'wlaściwą nazwą' m_ czy o to że parametr/argument metody ma przed nazwą "_"
    Co do tego drugiego myślałem (szczerze mówiąc) że tak robią hakerzy więc się wzorowałem

  1. Nie twórz konstruktorów / destruktorów, jeśli nic nie mają robić

Jak widać metoda getAs sprawdza czy wskźanik jest zainicjalizowany (wartosc inna niż nullptr) A konstrutkor za pomoca listy minimalizacyjnej ja inicjalizuje (wartością nullptr)

  1. Rozkaz rozkaz

  2. Robię to źle bo nie wiedzialem/m jak to zrobić dobrze

6)<ratuenk_sytuacji_proba_obrócenia_shitcodu_w_docwicp>
Powiem na swoją obronę że maiłem to dokończyc i miało być więcej i lepiej i w ogóle :)
</ratuenk_sytuacji_proba_obrócenia_shitcodu_w_docwicp>

  1. Jest racja

  2. Dziękuje za linki

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