Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zawieranie szablonów klas, wywoływanie metod zawartego obiektu innej klasy...

Ostatnio zmodyfikowano 2015-09-08 12:57
Autor Wiadomość
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:
C/C++
#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:
C/C++
#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:
C/C++
#include "Klasy.hpp"
#include <iostream>
using namespace std;

int main()
{
    /*
        int tab[5] {1,2,3,4,5};
        valarray<int> one(tab, 5);
        valarray<int> two = one;
        Pair< valarray<int>, valarray<int> > obiekt(one, two);
        cout << obiekt.first()[2] << endl;
        cout << obiekt.second().sum() << endl;
        */ // Tutaj wszystko dziala,
   
    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(); // program zglasza blad
   
    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(); // to samo
    cout << "Laczna liczba butelek wina " << more.Label() << ": " << more.sum() /* zwraca 0 */ << endl;
    cout << "Koniec";
    return 0;
}
P-137215
pekfos
» 2015-09-03 14:13:44
C/C++
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<>.

C/C++
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ć?
P-137216
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?
P-137340
michal11
» 2015-09-08 11:53:45
Jeszcze by się przydało żebyś pokazał jaki błąd się wyświetla.
P-137341
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.
P-137343
« 1 »
  Strona 1 z 1