Jak przechowywać obiekty klas w std::vector na szablonach?

0

Witam, mam taki problem. Chciałem napisać program symulujący konto bankowe.
Zawiera 3 klasy, dwie klasy na operację wpłaty i wypłaty (każda osobno) oraz klasa konta, które będzie mieć kontener STL zawierający obiekty klas wpłaty i wypłaty, czyli wszystkie operacje wykonywane na koncie. Wszystkie klasy na szablonach, żeby dało się zrobić konta przystosowane do operacji na liczbach całkowitych jak i niecałkowitych. No i do tego przeciążony operator strumienia, żeby wyświetlić wszystkie operacje wykonywane na koncie.

Próbowałem to zrobić w ten sposób:



#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <string>
#include <typeinfo>
#include <exception>
#include <iterator>
#include <iostream>
#include <vector>

using namespace std;

template <typename typ>
class dochod
{
private:
	string opis;
	typ kwota;
public:
	dochod (string _opis,typ _kwota);
};

template <typename typ>
dochod<typ>::dochod (string _opis,typ _kwota)
{
	opis=_opis;
	kwota=_kwota;
}

template <typename typ>
class zwrot
{
private:
	string opis;
	typ kwota;
public:
	zwrot (string _opis,typ _kwota);
};

template <typename typ>
zwrot<typ>::zwrot (string _opis,typ _kwota)
{
	opis=_opis;
	kwota=_kwota;
}


template <typename typ>
class konto:public zwrot<typ>, public dochod<typ>
{
private:
	std::vector <typ> tablica;
	typ kwota;
public:
	konto();
	
	typ dodaj (typ operacja)
	{
		tablica.push_back(operacja);
	}
	
	friend ostream& operator << (ostream &wyjscie,const konto<typ> &wyj);

};
template <typename typ>
ostream& operator << (ostream &wyjscie,const konto<typ> &wyj)
{
	for (int i=0;i<wyj.tablica.size();++i)
	{
		wyjscie << wyj.tablica[i] << endl;
	}
	return wyjscie;
}

template <typename typ>
konto<typ>::konto()
{
	kwota=0;
}



int main()
{
	konto <int> test;
	dochod <int> op1("opis",100);
	test.dodaj(op1);

	_getch();
	return 0;
}


Spróbowałem stworzyć przykładowe konto i wykonać na nim przykładową operację, jednak jest błąd przy używaniu funkcji dodaj.

error C2664: 'konto<typ>::dodaj' : cannot convert parameter 1 from 'dochod<typ>' to 'int'

Czy coś jest źle zrobione?

2

class konto:public zwrot<typ>, public dochod<typ>

Od kiedy konto jest dochodem i zwrotem? o_O Może zacznij od podstaw takich jak dziedziczenie kontra zawieranie, zanim porwiesz sie na szablony?
Poza tym to co zrobiłeś nie ma sensu. konto<int> będzie miało vector<int> a nie vector<dochod<int>>. Szkoda słów.

0

Jak zrobisz

 konto <int> test; 

to Twoja funkcja dodaj będzie wyglądała tak

int dodaj (int operacja)
    {
        tablica.push_back(operacja);
    } 

czyli przyjmuje jako parametr zwykłego inta, a próbujesz jej przekazać całą klasę

dochod <int> op1 
0

@Shalom opisał problemy z zamysłem. Bezpośrednio kompilację blokuje błędne wywołanie funkcji dodaj. Oczekuje ona typu int (aka typ w konto<int>), ale podajesz jej dochod<int>. To są zupełnie różne typy.

0

Tak, faktycznie po napisaniu tego zdałem sobie sprawę, że powinno być inaczej, raczej klasa konto powinna zawierać obiekty klas dochod i zwrot. Tylko jak to zrobić żeby umieścić je w std::vector na szablonach, żeby obie operacje były rozróżnialne?

A jak zrobić żeby móc przekazać do funkcji dochod<int>? próbuję znaleźć rozwiązanie już kilka godzin.

0

Zrób klasę operacja i dwie klasy: dochod i zwrot, które po niej dziedziczą i w konto, w wektorze, możesz trzymać wskaźniki na klasę operacja i rzutować do niej te dwie klasy. I jakieś metody wirtualne do działania na tych dwóch klasach

0

@stryku dzięki za radę. A czy klasa operacja musi być na szablonie czy wystarczy jak szablonami będą dwie klasy pochodne? A klasa konto dziedziczy coś?

0

no jak nie chcesz robić oddzielnie klasy dla int i double to lepiej na szablonach
konto nic nie dziedziczy

http://www.matinfuj.fora.pl/archiwum,42/c-dziedziczenie-szablonow,1075.html
tu masz przykład dziedziczenia szablonu i klasy abstrakcyjnej z szablonem

0

Czy vector przechowujący wskaźniki na klasę operacja będzie wyglądać tak?
std::vector <operacja<typ>*> tablica;

0

Tak, ale jeśli te wskaźniki mają służyć - poza wskazywaniem - do kontroli czasu życia tych obiektów to koniecznie użyj shared_ptr lub unique_ptr zamiast "nagich" wskaźników.

0

Właściwie nie decydują o czasie życia obiektów.

klasa konta ma mieć tylko funkcje dodania operacji, wyczyszczenia wszystkich operacji oraz wyświetlenia wszystkich operacji przeciążonym operatorem strumienia.
dodanie operacji można realizować funkcją dodaj, tylko chyba ją jeszcze trzeba poprawić.
wyczyszczenie można skorzystać z funkcji vectora clear()
a wyświetlenie to strumieniem.

Rozumiem, że jeszcze muszę zmodyfikować funkcję dodaj, żeby zamiast typ było operacja typ* czy coś podobnego żeby to poprawnie działało?

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