ďťż

Ładny brzuch

Pisze program kalkulator przeliczający pomiędzy bajtami,bitami itp. itd. Ale podczas kompilacji wyskakują mi błędy. Jedne z nich mówią:
11 C:\Dev-Cpp\main.cpp no match for 'operator>>' in 'std::cin >> ttypdanych'
a drugi błą, który mnie też dręczy to:
17 C:\Dev-Cpp\main.cpp `zwroc' undeclared (first use this function)
I nie wiem czemu mi to niechodzi. Używam programu Dev-c++.
Poniżej umieszczam program
Plik main:
#include<iostream> #include"klasa.h" #include<conio.h> main() {      TYP ttypdanych;      int nwartosc;      calc kalk;      std::cout << "Podaj typ danych: " << std::endl;      std::cin >> ttypdanych;      std::cout << "Podaj wartosc: " << std::endl;      std::cin >> nwartosc;      kalk.wez(ttypdanych,nwartosc);      std::cout << "W jakim typie wyswietlic? " << std::endl;      std::cin >> ttypdanych;      zwroc(ttypdanych);      getch(); }
Plik klasa.h
enum TYP {bit, bajt,kilobajt,megabajt,gigabajt};       class calc {      private:              TYP typdanych;              int wartosc;      public:             int wez(TYP m_typdanych,int m_wartosc);             int zwroc(TYP m_typdanych);               };
Plik klasa.cpp
#include<iostream> #include"klasa.h" int calc::wez(TYP m_typdanych,int m_wartosc) {    switch m_typdanych    {           case bit:                m_wartosc=m_wartosc/8;                break;           case kilobajt:                m_wartosc=m_wartosc*10;                break;           case megabajt:                m_wartosc=m_wartosc*1000;                break;           case gigabajt:                m_wartosc=m_wartosc*100000;                break;    }    return wartosc=m_wartosc; } int calc::zwroc(TYP m_typdanych) {      m_typdanych=typdanych;    switch m_typdanych    {           case bit:                m_wartosc=m_wartosc*8;                return m_wartosc;           case bajt:                return m_wartosc;           case kilobajt:                m_wartosc=m_wartosc/10;                return m_wartosc;           case megabajt:                m_wartosc=m_wartosc/1000;                return m_wartosc;           case gigabajt:                m_wartosc=m_wartosc/100000;                return m_wartosc;    }    return m_wartosc; }

No i jak wie ktoś jak to rozwiązać?



Poprawności kodu zawartego w klasie nie sprawdzałem ale błąd masz w 3 linijce od końca w funkcji main
zamiast
zwroc(ttypdanych);
według mnie powinno być
kalk.zwroc(ttypdanych);

Dzieki za pomoc. To jeden problem jest rozwiązany ale czemu mi nie rozpoznaje std::cin (pierwszy błąd)??
Użytkownik Misial edytował ten post 05 listopad 2005, 22:53

Dzieki za pomoc. To jeden problem jest rozwiązany ale czemu mi nie rozpoznaje std::cin (pierwszy błąd)??



Troche zmodyfikowałem program tak jak mówisz ale teraz wyskakuje
 [Linker error] undefined reference to `calc::wez(int, int)'
i jeszcze taki sam tyle, że do drgiej metody.
A pozatem może mi ktoś powiedzieć czemu kompilator nie radzi sobie z moim TYP'em??
Użytkownik Misial edytował ten post 06 listopad 2005, 00:25
Jak dla mnie to popełniłeś dużo błędów:
std::cin >> ttypdanych;
Wywala błąd z cin bo taka akcja jest niemożliwa do wykonania. Prubujesz wczytać jedną wartość gdzie w klasie są 2 zmienne w private gdzie i tak jakby była nawet jedna, to i tak przez cin nie mozesz zainiciować w ten sposób. Musisz napisać konstruktor do klasy, albo jakąś inną funkcję składową klasy do przypisywania zmiennych. Dodatkowo w sprawie Twojego enum. Nie jestem pewien jak to będzie dokładnie działać, ale np możesz wykonać krótki opis dla usera i przyporządkować liczby do bajt, kilobajt itd., a następnie w konstruktorzę rzutować daną liczbę na TYP(tak się napewno da):
//w konstruktorze bo jest on częścią klasy więc ma dostęp do private typdanych=static_cast<TYP>(zmienna_z_liczba_int)
Tylko niepamiętam jak domyślnie są numerowane typy w enum domyślnie ( czy od 0 czy od 1 ). A dopiero potem odpowiednimi funkcjami składowymi klasy operuj i wykonuj działania.
Tak właściwie to nie mam czasu dokładnie się temu wszystkiemu przygladnąć, ale jakoś mi się wydaje, że nawet gdy pozbędziesz się tych błędów to całośc i tak nie będzie działałać.
PS. Proponuje poczytaj troche o klasach :)


Tylko niepamiętam jak domyślnie są numerowane typy w enum domyślnie ( czy od 0 czy od 1 ).
Hmm... AFAIK to nie tylko nie wczytasz cin'em do enum'a, ale też i static_cast może nie zadziałać; nie sprawdzałem, jak nie zadziała to zrób reinterpret_cast. Ale IMO taki projekt jest do bani z przyczyn, których - szczerze - nie bardzo chce mi się teraz tłumaczyć. Po prostu wczytywanie danych z int'a na 'chama' do enum'a to chakowanie własnego programu. Przeprojektuj tak, żeby to nie używało enum'ów.

Pozdrawiam,
TeMPOraL.

Używać można, ale w innym kierunku: najpierw wczytujesz inta, a później sprawdzasz w bloku switch...case z pomocą enuma

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •