Witam!
Mam taką klasę:
template <typename _typ>
class Atrybut {
private:
...
_typ wartosc;
...
}
I teraz w programie potrzebuję zrobić vector elementów typu Atrybut, ale różnych typów.
Jak to zrobić?
Witam!
Mam taką klasę:
template <typename _typ>
class Atrybut {
private:
...
_typ wartosc;
...
}
I teraz w programie potrzebuję zrobić vector elementów typu Atrybut, ale różnych typów.
Jak to zrobić?
Nie bardzo rozumiem.
vector<Atrybut<int>>
?
Chodzi o to, zeby vector wyglądał w taki sposób:
["Imie"]
[1751] //int
[161.788] //float
['k'] //char
,a vector vector<Atrybut<int> >
bedzie wygladał:
[1236]
[23472]
[2134]
Nie da się czegoś takiego zrobić. Atrybut<int>
oraz Atrybut<float>
to zupełnie inne typy. Możesz kombinować z uniami, albo wszystko trzymać w std::string
i konwertować kiedy potrzeba...
Endrju napisał(a):
...Możesz kombinować z uniami, albo wszystko trzymać w
std::string
i konwertować kiedy potrzeba...
albo po ludzku użyć polimorfizmu - w wektorze trzymać wskaźniki do obiektów o wspólnej bazie.
adf88 napisał(a):
Endrju napisał(a):
...Możesz kombinować z uniami, albo wszystko trzymać w
std::string
i konwertować kiedy potrzeba...
albo po ludzku użyć polimorfizmu - w wektorze trzymać wskaźniki do obiektów o wspólnej bazie.
W takim razie w Bazie będą potrzebne metody wirtualne, a szablony nie mogą być funkcjami wirtualnymi.
Chyba, że inaczej to rozumiesz? Albo ja źle rozumuję.
//No chyba, że zmienna będzie publiczna i ją zastąpię w pochodnej typem _typ, ale wtedy nie mam getValue(), tylko odwołuję się do zmiennej bezpośrednio element.zmienna
adf88 napisał(a):
albo po ludzku użyć polimorfizmu - w wektorze trzymać wskaźniki do obiektów o wspólnej bazie.
A metoda get
w klasie bazowej jak będzie wyglądać?
template<typename _typ="_typ">
virtual _typ get() {return wartosc;}
kumek napisał(a):
template<typename _typ="_typ">
virtual _typ get() {return wartosc;}
Jak chcesz zrobić szablonową metodę wirtualną?
Endrju napisał(a):
A metoda
get
w klasie bazowej jak będzie wyglądać?
Jaka metodaget
? Nie wiem czy dobrze rozumiem, ale chodziło mi o polimorfizm czyli o operowanie na obiektach poprzez wspólny interfejs metod wirtualnych, niezależny od parametru T.
adf88 napisał(a):
Jaka metoda
get
? Nie wiem czy dobrze rozumiem, ale chodziło mi o polimorfizm czyli o operowanie na obiektach poprzez wspólny interfejs metod wirtualnych, niezależny od parametru T.
Chodzi o to, że on chce aby wektor przechowywał "jakieś" elementy, które będą trzymać pola rożnych typów. Nazwa "Atrybut" sugeruje, że jest jakieś coś, co ma np. takie atrybuty: długość (liczba), nazwa (napis). Jeden wektor ma trzymać te atrybuty i umożliwiać do nich dostęp. Polimrofizm moim zdaniem na niewiele się tu zda, bo metoda zwracające te wartości musi umieć zwracać różne typy, a to nie jest możliwe. Szablony z kolei nie pozwolą na trzymanie atrybutów w jednym wektorze.
Może coś takiego?
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Base
{
virtual ostream &out(ostream &s)const=0;
virtual ~Base() {}
};
ostream &operator<<(ostream &s,const Base &B) { return B.out(s); }
template <typename _typ> class Atrybut:public Base
{
private:
_typ wartosc;
public:
Atrybut(_typ wartosc=_typ()):wartosc(wartosc) {}
virtual ostream &out(ostream &s)const { return s<<wartosc; }
};
int main()
{
vector<Base*> Tb;
Tb.push_back(new Atrybut<int>(1));
Tb.push_back(new Atrybut<double>(2.2));
Tb.push_back(new Atrybut<string>("Ala ma kota"));
for(vector<Base*>::iterator i=Tb.begin();i!=Tb.end();++i) cout<<**i<<' ';
for(vector<Base*>::iterator i=Tb.begin();i!=Tb.end();++i) delete *i;
cin.sync();
cin.get();
return 0;
}
Chodzi tutaj o atrybuty z języka XML i ostatecznie przestałem kombinować i ostatecznie nazwę i wartość zapisuję jako string. Do zapisu i odczytu z pliku wystarczy, a w razie potrzeby będę konwertował na potrzebne typy.
Dzięki za pomoc.
Użyj gotowej biblioteki. Do XML jest ich trochę.