Skocz do zawartości

[C++] Nowa zmienna


ALT

Rekomendowane odpowiedzi

boś głupi.

ale równie dobrze możesz użyć map dynamicznych obiektów i makr, aby załatwić sobie coś takiego.

Odnośnik do komentarza
Udostępnij na innych stronach

Mozna za pomocą templatów? Nawet cale tablice o typie podanym w argumencie.

template <typename T>
T f(T a,T b){
    return a+b;
}

To akurat z oficjalnej cplusplus.com, ale rownie dobrze zamiast zwracac a+b mozesz sobie utworzyc zmienna/tablice i ja wywrócić.

Odnośnik do komentarza
Udostępnij na innych stronach

Z ciekawości. W jakim celu chciałbyś tworzyć zmienne o przypisywanych w trakcie gry nazwach? Przecież w kodzie to i tak wszystko jedno jaką mają nazwę (potem ona znika), a na "zewnątrz" możesz sobie po prostu dodać string to tej zmiennej i wyświetlać ją jako nazwę.

Odnośnik do komentarza
Udostępnij na innych stronach

Ehh...nie lubię C++ :<

Na szczęście jest na tyle elastyczne, że rozwiązanie zawsze znajdziesz.

a na "zewnątrz" możesz sobie po prostu dodać string to tej zmiennej i wyświetlać ją jako nazwę.

To jest myśl. Możesz zrobić sobie dynamiczną tablicę struktur. Struktury te będą się składać ze zmiennej właściwej o typie jaki sobie zażyczysz oraz z napisu który będzie tak jakby nazwą tej zmiennej.

Tablica ta będzie opakowana w obiekt narzędziowy, który pozwoli Ci dowolnie zwiększać i zmniejszać wielkość tablicy(poprzez tworzenie nowej o większej/mniejszej wielkości, kopiowanie pamięci i usuwanie starej).

I problem rozwiązany.

Odnośnik do komentarza
Udostępnij na innych stronach

Czyli coś takiego (mniej więcej):

enum eType
{
  tUndefined,
  tLong,
  tLonglong,
  tFloat,
  tDouble,
  tLongdouble,
  tString
};

class cCustomVar
{
  private:
    void* var;
    string name;
    eType type;   // musisz mieć gdzieś zapisany jaki to typ
  public:
    cCustomVar() : var(NULL), name(""), type(tUndefined) {}
    ~cCustomVar() { if (type != tUndefined) delete var; }

    bool Init(eType t, string n);
    bool Release();
};

bool cCustomVar::Init(eType t, string n)
{
  if (type != tUndefined) return false;
  switch (t)
  {
    case tLong: var = new long; break;
    case tLonglong: var = new long long; break;
    case tFloat: var = new float; break;
    case tDouble: var = new double; break;
    case tLongdouble: var = new long double; break;
    case tString: var = new string; break;
  }
  name = n;
  return true;
}

bool cCustomVar::Release()
{
  if (type == tUndefined) return false;
  delete var;
  name = "";
  type = tUndefined;
  return true;
}

 

I tak dalej. Tylko wciąż się pytam po co? O ile samo stworzenie i kasowanie jest łatwe, to już przekazanie wartości może być trudniejsze (przeciążenie funkcji przypisania dla każdego typu i sprawdzenie jego poprawności z ustalonym). A pobranie? C++ nie wybierze odpowiedniej funkcji według zmiennej wewnątrz klasy. Dużo niepotrzebnej roboty, wokół problemu powstanie taka otoczka kodu, że nie wiem, czy cel i takie rozwiązanie jest tego warte.

Odnośnik do komentarza
Udostępnij na innych stronach

(przeciążenie funkcji przypisania dla każdego typu i sprawdzenie jego poprawności z ustalonym). A pobranie? C++ nie wybierze odpowiedniej funkcji według zmiennej wewnątrz klasy.

1. Szablony

2. rtti(typeid), potem switch Palnąłem głupotę, przecież dla void* to nie zadziała. Ale wystarczy podczas stworzenia zapisać sobie typ do zmiennej(tak jak u Ciebie - eType), potem użyć instrukcji switch i rzutować to na wskaźnik innego typu. Wtedy już da się skorzystać z RTTI czy innego mechanizmu.

 

Można jeszcze inaczej: oddzielna struktura dla każdego typu(żeby za dużo nie pisać - szablony), chociaż rozwiązanie mało optymalne.

 

po co?

Program, który sam się przeprogramowuje? :P (pytanie do obeznanych: czy tak nie działają wirusy polimorficzne?)

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...