Skocz do zawartości
kamail86

Wywołanie konstruktora

Rekomendowane odpowiedzi

Jak wywołać konstruktor Plik wzor, tak by na ekranie wyświetlił się napis "przykladowy napis"? Bo wpisanie w main "Plik wzór;" go nie wywołuje. Poniżej kod:

 

 

#include <cstdlib>#include <iostream>#include <fstream>using namespace std;int FileSize(const char* sFileName){ std::ifstream f; f.open(sFileName, std::ios_base::binary | std::ios_base::in); if (!f.good() || f.eof() || !f.is_open()) { return 0; } f.seekg(0, std::ios_base::beg); std::ifstream::pos_type begin_pos = f.tellg(); f.seekg(0, std::ios_base::end); return static_cast<int>(f.tellg() - begin_pos);}class Plik{ private: char  nazwa[300]; char * buf; int rozmiar; int liczbaW[256]; void liczbaWObl() {   for(int i=0;i<256;i++)    liczbaW[i]=0;   for(int i=0;i<rozmiar;i++)    liczbaW[tolower(buf[i])]++; }  public:int dajliczbaW(const char co) {   return liczbaW[co]; } double dajczestW(const char co) {   int s=0;   for(int i=0;i<256;i++)    s += liczbaW[i];   return  (dajliczbaW(co)*1.0)/s; } Plik() {  buf = NULL; } Plik(const char * nazwap) {  ifstream PlikWe;  char c;  int i=0;  rozmiar = FileSize(nazwap);  buf = new char[rozmiar];  PlikWe.open(nazwap,ios::in);  while (PlikWe.good())  {   c = PlikWe.get();     buf[i++]=c;  }  rozmiar=i-1;  strcpy(nazwa, nazwap);  PlikWe.close();  liczbaWObl(); } Plik( const Plik &wzor) {  int i;  rozmiar = wzor.rozmiar;  strcpy(nazwa, wzor.nazwa);  buf = new char[rozmiar];  for(i=0;i<rozmiar;i++)   buf[i] = wzor.buf[i];  for(i=0;i<256;i++)   liczbaW[i] = wzor.liczbaW[i];   cout<<"przykladowy napis"; }};int main(int argc, char *argv[]){   system("PAUSE");   return EXIT_SUCCESS;}

 

 

Konkretnie chodzi o wywołanie tego:

 

Plik( const Plik &wzor) {  int i;  rozmiar = wzor.rozmiar;  strcpy(nazwa, wzor.nazwa);  buf = new char[rozmiar];  for(i=0;i<rozmiar;i++)   buf[i] = wzor.buf[i];  for(i=0;i<256;i++)   liczbaW[i] = wzor.liczbaW[i];   cout<<"przykladowy napis"; }

 

Edytowane przez kamail86

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Gwoli ścisłości: to konstruktor kopiujący. Kod KoVola powinien działać, podobnie jak Plik foo(Plik()). Lecz nic dziwnego, że się wysypuje, skoro próbujesz nadawać rozmiar buf niezainicjalizowaną zmienną rozmiar, a nawet operować na nullptr.

 

buf = new char[rozmiar];
Nie inicjalizujesz nigdzie zmiennej rozmiar, przez co ma ona wartość niezdefiniowaną. Niebezpiecznie jest przydzielać niezdefiniowany rozmiarowo obszar pamięci.

 

buf[i] = wzor.buf[i];
Zmienna wzor.buf inicjalizowana jest w konstruktorze domyślnym wskaźnikiem NULL, którego nie da się wyłuskać ani nie można wywoływać na jego rzecz żadnych operatorów.

 

Kod jest kompletnie wyzuty z zabezpieczeń, a uwzględnienie najprostszego z nich pozwoli ci osiągnąć cel:

 

Plik(const Plik &wzor) {    int i;    rozmiar = wzor.rozmiar;    strcpy(nazwa, wzor.nazwa);    if (wzor.buf) {        buf = new char[rozmiar];        for(i=0;i<rozmiar;i++)            buf[i] = wzor.buf[i];    } else {        buf = NULL;    }    for(i=0;i<256;i++)        liczbaW[i] = wzor.liczbaW[i];    cout<<"przykladowy napis"; }
Dlaczego nie używasz std::string?
  • Upvote 1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Co do tych braków w kodzie to po prostu wszystkiego nie kopiowałem by nie było zbyt dużo doczytania ;) Natomiast co do wysypywania się programu to już wiem o co chodziło. Program był pisany na laptopie. Natomiast poradę KoVola testowałem na stacjonarce i widocznie na niej jest coś nie tak z kompilatorem bo na lapku działa dobrze ;) Dzięki wszystkim za pomoc.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...