ďťż

Ł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
  •