Zawieranie szablonów klas, wywoływanie metod zawartego obiektu innej klasy...
Ostatnio zmodyfikowano 2015-09-08 12:57
Lucas535 Temat założony przez niniejszego użytkownika |
Zawieranie szablonów klas, wywoływanie metod zawartego obiektu innej klasy... » 2015-09-03 13:57:25 Witam, jeśli ktoś miałby ochotę rzucić okiem i podpowiedzieć dlaczego program nie działa byłbym wdzięczny. Mianowicie jest to zadanie z książki Prata, nie będę wypisywał treści, bo to nie ma teraz znaczenia, problem polega na tym, że program zgłasza awarię przy metodzie Wine::Show(), a konkretnie przy wywoływaniu metod obiektu butelki klasy Pair< valarray<int>, valarray<int> >. W programie na początku jak widać te metody wywołują się normalnie, ale z klasy Wine już jest problem. Ponadto metoda Wine::sum() także nie działa jak należy... Plik nagłówkowy: #ifndef KPAIR #define KPAIR
#include <valarray> #include <string> using namespace std;
template < typename T1, typename T2 > class Pair { private: T1 a; T2 b; public: Pair() { } Pair( const T1 & aval, const T2 & bval ) : a( aval ) , b( bval ) { } T1 & first() { return a; } T2 & second() { return b; } T1 first() const { return a; } T2 second() const { return b; } };
class Wine { private: string nazwa; Pair < valarray < int >, valarray < int > > butelki; int liczba_rocznikow; public: Wine() { nazwa = "Brak"; liczba_rocznikow = 0; } Wine( const string & l, const int y, const int yr[], const int bot[] ); Wine( string & l, int y ); void GetBottles(); string & Label(); int sum(); void Show(); };
#endif
Definicje: #include "Klasy.hpp" #include <iostream> using namespace std;
Wine::Wine( const string & l, const int y, const int yr[], const int bot[] ) { nazwa = l; liczba_rocznikow = y; valarray < int > one( yr, y ); valarray < int > two( bot, y ); Pair < valarray < int >, valarray < int > > nowa = Pair < valarray < int >, valarray < int > >( one, two ); butelki = nowa; }
Wine::Wine( string & l, int y ) { nazwa = l; liczba_rocznikow = y; valarray < int > one( y ); valarray < int > two( y ); Pair < valarray < int >, valarray < int > > nowa( one, two ); butelki = nowa; }
void Wine::GetBottles() { int tablica1[ liczba_rocznikow ]; int tablica2[ liczba_rocznikow ]; cout << "Podaj roczniki i liczby butelek:\n"; for( int i = 0; i < liczba_rocznikow; i++ ) { cout << "Rocznik " << i + 1 << " butelki: "; cin >> tablica1[ i ]; cout << "Liczba tych butelek: "; cin >> tablica2[ i ]; } valarray < int > one( tablica1, liczba_rocznikow ); valarray < int > two( tablica2, liczba_rocznikow ); butelki = Pair < valarray < int >, valarray < int > >( one, two ); }
string & Wine::Label() { return nazwa; }
int Wine::sum() { return( butelki.second() ).sum(); }
void Wine::Show() { cout << "Wino: " << nazwa << endl; cout << "\tRocznik Butelki\n"; for( int i = 0; i < liczba_rocznikow; i++ ) { cout << "\t" << butelki.first()[ i ] << "\t" << butelki.second()[ i ] << endl; } }
Funkcja główna: #include "Klasy.hpp" #include <iostream> using namespace std;
int main() { cout << "Podaj nazwe wina: "; string lab; getline( cin, lab ); cout << "Podaj liczbe rocznikow: "; int yrs; cin >> yrs; Wine holding( lab, yrs ); holding.GetBottles(); holding.Show(); const int YRS = 3; int y[ YRS ] = { 1993, 1995, 1998 }; int b[ YRS ] = { 48, 60, 72 }; Wine more( "Gushing Grape Red", YRS, y, b ); more.Show(); cout << "Laczna liczba butelek wina " << more.Label() << ": " << more.sum() << endl; cout << "Koniec"; return 0; }
|
|
pekfos |
» 2015-09-03 14:13:44 int tablica1[ liczba_rocznikow ]; int tablica2[ liczba_rocznikow ];
valarray < int > one( tablica1, liczba_rocznikow ); valarray < int > two( tablica2, liczba_rocznikow );
|
To nie jest poprawne. Wystarczy samo valarray<>. valarray < int > one( yr, y ); valarray < int > two( bot, y ); Pair < valarray < int >, valarray < int > > nowa = Pair < valarray < int >, valarray < int > >( one, two ); butelki = nowa;
|
Dłużej się nie dało tego zapisać? |
|
Lucas535 Temat założony przez niniejszego użytkownika |
» 2015-09-08 11:43:30 Nie pomogłeś, wręcz przeciwnie, jakieś inne pomysły? |
|
michal11 |
» 2015-09-08 11:53:45 Jeszcze by się przydało żebyś pokazał jaki błąd się wyświetla. |
|
pekfos |
» 2015-09-08 12:57:14 Nie pomogłeś, wręcz przeciwnie, jakieś inne pomysły? |
Z innych pomysłów polecam poprawienie podanego błędu. valarray<>::resize() to wszystko, czego potrzeba do wywalenia tej błędnej i zbędnej tablicy pomocniczej. |
|
« 1 » |