Ĺ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
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