Ĺadny brzuch
Zrobiłem tak ale coś jest jeszcze nie tak. Kompiluje sie ale daje bład. Coś mi sie wydaje ze w tych wskaźnikach coś nie tak;/.
Macie pomysł.
Kompilowałem w DevC++
#include <cstdlib> #include <iostream> using namespace std; class dane{ public: char* imie; char* nazwisko; dane(char *a,char *b){ strcpy(imie,a); strcpy(nazwisko,b); cout<<"Konstruktor\n"; } dane(const dane& kd){ strcpy(imie,kd.imie); strcpy(nazwisko,kd.nazwisko); cout<<"konst kopiujacy\n"; } ~dane(){ cout<<"destruktor\n"; } void info(){ cout<<imie; cout<<nazwisko<<endl; } }; int main(int argc, char *argv[]) { dane a("iiiiii","nnnnnn"); a.info(); system("PAUSE"); return EXIT_SUCCESS; }
Zrobiłem tak ale coś jest jeszcze nie tak. Kompiluje sie ale daje bład. Coś mi sie wydaje ze w tych wskaźnikach coś nie tak;/.
Dobrze byś zrobił, gdybyś napisał jaki ten błąd.
windowsowy ;]
po prostu jeździsz po niezainicjalizowanym obszarze pamięci. te wskaźniki imie i nazwisko nie wskazują na nic. poprawnie jest tak:
char imie[100]; char nazwisko[100];
a poza tym nie widzę potrzeby stosowania jednocześnie iostream i cstdio. czyli podsumowując, kod idealny(chyba :) ) powinien wyglądać tak:
#include "cstdio" #include "cstring" class dane { public: char imie[100]; char nazwisko[100]; dane(const char* a, const char* b) { strcpy(imie, a); strcpy(nazwisko, b); printf("konstruktor\n"); } dane(const dane& a) { strcpy(imie, a.imie); strcpy(nazwisko, a.nazwisko); printf("kopiujacy\n"); } ~dane() { printf("destruktor\n"); } void info() { printf("%s\n%s\n", imie, nazwisko); return; } }; int main() { dane a("Andrzej", "Lepper"); a.info(); return 0; }
a czego nie można zrobić tego na cout<<??Trzeba jakąś bibliotekę dodać??
A jak sie da to jak by to wyglądało.
a czego nie można zrobić tego na cout<<??Trzeba jakąś bibliotekę dodać??
A jak sie da to jak by to wyglądało.
No niestety tak nie idzie.
`cout' undeclarated (first use in function)
Użytkownik guru edytował ten post 08 lipiec 2006, 12:59
o Boże poszukaj troszkę w googlach jakichś. musisz dać po dyrektywach #include taką linijkę:
using namespace std;
albo zamiast cout pisać std::cout
ty sobie najpierw przeczytaj jakas ksiazke o podstawach c++ a pozniej sie bierz za obiekty ;)
coś ogarniam ale musze sobie to poukładać. Detale ;D
pozd.
skoro to ma byc c++ to az sie prosi o uzycie std::string ;). Mniej problemow, kod bezpieczniejszy, i nie byloby topicka =], zadnych strcpy, printf-ow itp itd (bo i po co)
A jak duży jest narzut pamięci?
Mozna zrobic i tak:
#include <iostream> #include<string> using namespace std; class dane{ public: string imie; string nazwisko; dane(string a, string b){ imie = a; nazwisko = b; cout<<"Konstruktor!!!\n"; } dane(const dane& kd){ imie = kd.imie; nazwisko = kd.nazwisko + " !!!KOPIA!!!"; cout<<"Konstruktor kopiujacy!!!\n"; } ~dane(){ cout<<"Destruktor!!!\n"; } void info(){ cout<<imie << " "; cout<<nazwisko<<endl; } }; int main(int argc, char *argv[]) { { dane a("gall","anonim"); a.info(); dane b=a; b.info(); } system("PAUSE"); return EXIT_SUCCESS; }
No niestety tak nie idzie.
`cout' undeclarated (first use in function)
cout znajduje się w przestrzeni nazw (namepace) std, co oznacza bibliotekę standardową. W C++ do wszystkiego, co znajduje się w przestrzeni nazw odwołuje się przez użycie ::, czyli np.:
std::cout << "tekst\n";
Ale można, tak jak DaViDeX już mówił, użyć
using namespace std;
co oznacza, że przestrzeń nazw std jest uznawana jako domyślna i nie trzeba tego std::
Tak samo jest z std::cin, std::string itd. itp.
A co do iostream i cstdio - cstdio pochodzi z ANSI C, ale można używać w C++, choć iostream w większości przypadków jest lepsze. Np. pisanie jest wygodniejsze.
skoro to ma byc c++ to az sie prosi o uzycie std::string ;). Mniej problemow, kod bezpieczniejszy, i nie byloby topicka =], zadnych strcpy, printf-ow itp itd (bo i po co)
printf-y faktycznie są zbędne. Ale niestety czasami zdażają się sytuacje, kiedy std::stringów nie można użyć.
Ale niestety czasami zdażają się sytuacje, kiedy std::stringów nie można użyć.
Np ?. Jedyne "ale" to alokacje, ale i z tym mozna sobie poradzic. Bardziej by mi pasowala wypowiedz - sa sytuacje gdzie zwykle char[] jest lepsze;)
czarnuch nie rob tak:
dane(string a, string b)
Bo tworzysz po drodze obiekty tymczasowe (zbedna alokacja zasobow - tutaj pamieci oraz jej zwolnienie). Zamiast tego rob tak:
dane(const string &a, const string &b)
po prostu zapisujac do pamieci te lancuchy tekstowe kasujesz cos w pamieci, zrob cos takiego:
#include <cstdlib> #include <iostream> using namespace std; class dane{ public: char* imie; char* nazwisko; dane(char *a,char *b){ imie=new char[strlen(a)+1]; strcpy(imie,a); nazwisko=new char[strlen(b)+1]; strcpy(nazwisko,b); cout<<"Konstruktor\n"; } dane(const dane& kd){ delete imie; delete nazwisko; imie=new char[strlen(kd.imie)+1]; strcpy(imie,kd.imie); nazwisko=new char[strlen(kd.nazwisko)+1]; strcpy(nazwisko,kd.nazwisko); cout<<"konst kopiujacy\n"; } ~dane(){ cout<<"destruktor\n"; } void info(){ cout<<imie; cout<<nazwisko<<endl; } }; int main(int argc, char *argv[]) { dane a("iiiiii","nnnnnn"); a.info(); system("PAUSE"); return EXIT_SUCCESS; }
[/quote]
pzdr
Użytkownik JsD edytował ten post 06 październik 2006, 22:33
{...} dane(const dane& kd){ delete imie; delete nazwisko; {...}
Nie radziłbym na "dzień dobry" usuwać zawartości pól imie i nazwisko. A co jeśli w argumencie dostaniesz TEN SAM obiekt?
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Macie pomysł.
Kompilowałem w DevC++
#include <cstdlib> #include <iostream> using namespace std; class dane{ public: char* imie; char* nazwisko; dane(char *a,char *b){ strcpy(imie,a); strcpy(nazwisko,b); cout<<"Konstruktor\n"; } dane(const dane& kd){ strcpy(imie,kd.imie); strcpy(nazwisko,kd.nazwisko); cout<<"konst kopiujacy\n"; } ~dane(){ cout<<"destruktor\n"; } void info(){ cout<<imie; cout<<nazwisko<<endl; } }; int main(int argc, char *argv[]) { dane a("iiiiii","nnnnnn"); a.info(); system("PAUSE"); return EXIT_SUCCESS; }
Zrobiłem tak ale coś jest jeszcze nie tak. Kompiluje sie ale daje bład. Coś mi sie wydaje ze w tych wskaźnikach coś nie tak;/.
Dobrze byś zrobił, gdybyś napisał jaki ten błąd.
windowsowy ;]
po prostu jeździsz po niezainicjalizowanym obszarze pamięci. te wskaźniki imie i nazwisko nie wskazują na nic. poprawnie jest tak:
char imie[100]; char nazwisko[100];
a poza tym nie widzę potrzeby stosowania jednocześnie iostream i cstdio. czyli podsumowując, kod idealny(chyba :) ) powinien wyglądać tak:
#include "cstdio" #include "cstring" class dane { public: char imie[100]; char nazwisko[100]; dane(const char* a, const char* b) { strcpy(imie, a); strcpy(nazwisko, b); printf("konstruktor\n"); } dane(const dane& a) { strcpy(imie, a.imie); strcpy(nazwisko, a.nazwisko); printf("kopiujacy\n"); } ~dane() { printf("destruktor\n"); } void info() { printf("%s\n%s\n", imie, nazwisko); return; } }; int main() { dane a("Andrzej", "Lepper"); a.info(); return 0; }
a czego nie można zrobić tego na cout<<??Trzeba jakąś bibliotekę dodać??
A jak sie da to jak by to wyglądało.
a czego nie można zrobić tego na cout<<??Trzeba jakąś bibliotekę dodać??
A jak sie da to jak by to wyglądało.

No niestety tak nie idzie.
`cout' undeclarated (first use in function)
Użytkownik guru edytował ten post 08 lipiec 2006, 12:59
o Boże poszukaj troszkę w googlach jakichś. musisz dać po dyrektywach #include taką linijkę:
using namespace std;
albo zamiast cout pisać std::cout
ty sobie najpierw przeczytaj jakas ksiazke o podstawach c++ a pozniej sie bierz za obiekty ;)
coś ogarniam ale musze sobie to poukładać. Detale ;D
pozd.
skoro to ma byc c++ to az sie prosi o uzycie std::string ;). Mniej problemow, kod bezpieczniejszy, i nie byloby topicka =], zadnych strcpy, printf-ow itp itd (bo i po co)
A jak duży jest narzut pamięci?
Mozna zrobic i tak:
#include <iostream> #include<string> using namespace std; class dane{ public: string imie; string nazwisko; dane(string a, string b){ imie = a; nazwisko = b; cout<<"Konstruktor!!!\n"; } dane(const dane& kd){ imie = kd.imie; nazwisko = kd.nazwisko + " !!!KOPIA!!!"; cout<<"Konstruktor kopiujacy!!!\n"; } ~dane(){ cout<<"Destruktor!!!\n"; } void info(){ cout<<imie << " "; cout<<nazwisko<<endl; } }; int main(int argc, char *argv[]) { { dane a("gall","anonim"); a.info(); dane b=a; b.info(); } system("PAUSE"); return EXIT_SUCCESS; }
No niestety tak nie idzie.
`cout' undeclarated (first use in function)
cout znajduje się w przestrzeni nazw (namepace) std, co oznacza bibliotekę standardową. W C++ do wszystkiego, co znajduje się w przestrzeni nazw odwołuje się przez użycie ::, czyli np.:
std::cout << "tekst\n";
Ale można, tak jak DaViDeX już mówił, użyć
using namespace std;
co oznacza, że przestrzeń nazw std jest uznawana jako domyślna i nie trzeba tego std::
Tak samo jest z std::cin, std::string itd. itp.
A co do iostream i cstdio - cstdio pochodzi z ANSI C, ale można używać w C++, choć iostream w większości przypadków jest lepsze. Np. pisanie jest wygodniejsze.
skoro to ma byc c++ to az sie prosi o uzycie std::string ;). Mniej problemow, kod bezpieczniejszy, i nie byloby topicka =], zadnych strcpy, printf-ow itp itd (bo i po co)
printf-y faktycznie są zbędne. Ale niestety czasami zdażają się sytuacje, kiedy std::stringów nie można użyć.
Ale niestety czasami zdażają się sytuacje, kiedy std::stringów nie można użyć.
Np ?. Jedyne "ale" to alokacje, ale i z tym mozna sobie poradzic. Bardziej by mi pasowala wypowiedz - sa sytuacje gdzie zwykle char[] jest lepsze;)
czarnuch nie rob tak:
dane(string a, string b)
Bo tworzysz po drodze obiekty tymczasowe (zbedna alokacja zasobow - tutaj pamieci oraz jej zwolnienie). Zamiast tego rob tak:
dane(const string &a, const string &b)
po prostu zapisujac do pamieci te lancuchy tekstowe kasujesz cos w pamieci, zrob cos takiego:
#include <cstdlib> #include <iostream> using namespace std; class dane{ public: char* imie; char* nazwisko; dane(char *a,char *b){ imie=new char[strlen(a)+1]; strcpy(imie,a); nazwisko=new char[strlen(b)+1]; strcpy(nazwisko,b); cout<<"Konstruktor\n"; } dane(const dane& kd){ delete imie; delete nazwisko; imie=new char[strlen(kd.imie)+1]; strcpy(imie,kd.imie); nazwisko=new char[strlen(kd.nazwisko)+1]; strcpy(nazwisko,kd.nazwisko); cout<<"konst kopiujacy\n"; } ~dane(){ cout<<"destruktor\n"; } void info(){ cout<<imie; cout<<nazwisko<<endl; } }; int main(int argc, char *argv[]) { dane a("iiiiii","nnnnnn"); a.info(); system("PAUSE"); return EXIT_SUCCESS; }
[/quote]
pzdr
Użytkownik JsD edytował ten post 06 październik 2006, 22:33
{...} dane(const dane& kd){ delete imie; delete nazwisko; {...}
Nie radziłbym na "dzień dobry" usuwać zawartości pól imie i nazwisko. A co jeśli w argumencie dostaniesz TEN SAM obiekt?