• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Klasa parametru niezależnego od typu. Funkcja zwracająca wartość parametru.

VPS Starter Arubacloud
0 głosów
486 wizyt
pytanie zadane 16 listopada 2017 w C i C++ przez niezalogowany

Witam, piszę klasę, która ma reprezentować ogólny parametr. Parametr może być różnego typu (bool, integer, float, string) dlatego klasa zawiera strukturę posiadającą zmienną typu int, double i string. W klasie mam również pole type, które zostaje ustawione na dany typ podczas tworzenia instancji klasy ( parametr ustawia typ raz w konstruktorze i nie ma potrzeby zmieniać go w trakcie życia obiektu ). O ile nie mam problemu z zapisywaniem wartości do parametru, w zależności od typu, to problem pojawia się przy potrzebie stworzenia funkcji odczytującej parametr. Jak napisać taką funkcję, albo jak obejść problem typu zwracanego przez funkcję GetValue() w zależności od typu przechowywanego w tej klasie? Za wszelkie pomysły i uwagi z góry dziękuję.
 

class Parameter
{
public:
	enum TypeOfParameter { BOOLEAN=0, INTEGER, FLOAT, STRING };
	Parameter(int id, TypeOfParameter type) : id(id), type(type) { };
	TypeOfParameter GetType() const { return type; }
	void ChangeValue(bool newValue);
	void ChangeValue(int newValue);
	void ChangeValue(double newValue);
	void ChangeValue(const std::string& newValue);
	// funkcja GetValue() zależna od przechowywanego typu
private:
	typedef struct { int vInt; double vFloat; std::string vString; } TValue;
	int id;
	TypeOfParameter type;
	TValue value;
};

2 odpowiedzi

0 głosów
odpowiedź 16 listopada 2017 przez Knayder Nałogowiec (37,640 p.)
wybrane 16 listopada 2017
 
Najlepsza

Polecam zapoznać się z templatami w c++
http://cpp.sh/4xgd7
^^  tutaj możesz sobie uruchomić ten kod.

#include <iostream>
#include <string>

template<typename T>
class Param{
public:
  Param(T obj) : 
    obj(obj)
  {
    
  }
  
  void setValue(T newValue){
    obj = newValue;
  }
  
  T getValue(){
    return obj;
  }
  
private:
  T obj;
};

int main()
{
  Param<int> a(10);
  Param<float> b(10.2f);
  Param<std::string> c("Hello World");
  
  std::cout << a.getValue() << '\n';
  std::cout << b.getValue() << '\n';
  std::cout << c.getValue() << '\n';
  return 0;
}
10
10.2
Hello World

 

komentarz 16 listopada 2017 przez j23 Mędrzec (194,920 p.)

Jeśli Parameter ma być typem elementów heterogenicznego zbioru, to szablon, który pokazał Knayder, nie będzie dobry. To, co Ty chcesz zrobić, to wspomniany std::variant, który jest dostępny dopiero od C++17.

komentarz 16 listopada 2017 przez niezalogowany

A załóżmy że stworzę szablon klasy Parameter z moimi dodatkowymi polami. A następnie utworzę taki wektor:

std::vector<std::variant<Parameter<int>, Parameter<float>, Parameter<string>>> container;

To powinno być ok? 

 

komentarz 16 listopada 2017 przez Knayder Nałogowiec (37,640 p.)
Powinno
komentarz 16 listopada 2017 przez j23 Mędrzec (194,920 p.)

To Ty powinieneś wiedzieć, czy będzie ok, bo Ty wiesz, co chcesz zrobić. Odniosłem wrażenie, że Parameter miał być czymś w rodzaju std::variant.

komentarz 16 listopada 2017 przez niezalogowany
Pytałem się, czy będzie działać, bo nie mam akurat dostępu do kompilatora C++17. Dokładnie Parameter to jest klasa przetrzymująca jakiś parametr z urządzenia o wartośći danego typu sposród wcześniej wymienionych, ale dodatkowo swoje id, nazwę, opis, numer urządzenia do którego należy itd.
0 głosów
odpowiedź 16 listopada 2017 przez j23 Mędrzec (194,920 p.)

Nie sądzę, żebyś wykombinował coś innego jak:

 bool GetValueAsBool() const;

int GetValueAsInt() const;

double GetValueAsDouble() const;

std::string GetValueAsString() const;

 

Możesz też zrobić GetValue() szablonem (ze specjalizacjami), ale generalnie sprowadzi się do tego samego.

 

Podobne pytania

0 głosów
1 odpowiedź 2,477 wizyt
0 głosów
0 odpowiedzi 260 wizyt
pytanie zadane 3 sierpnia 2019 w Python przez reaktywny Nałogowiec (40,650 p.)
0 głosów
2 odpowiedzi 190 wizyt

92,453 zapytań

141,262 odpowiedzi

319,087 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...