kamail86 Opublikowano 3 Września 2011 Zgłoś Opublikowano 3 Września 2011 (edytowane) 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 3 Września 2011 przez kamail86 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
KoVol Opublikowano 3 Września 2011 Zgłoś Opublikowano 3 Września 2011 Wklep w main: Plik wzor(wzor);Powinno zadziałać... 1 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
kamail86 Opublikowano 3 Września 2011 Zgłoś Opublikowano 3 Września 2011 Niestety aplikacja się wywala. Z tego co pamiętam to chyba trzeba ten konstruktor przed wywołaniem jeszcze zadeklarować w mainie, ale nie pamiętam jak to się robiło, a metodą prób i błędów jakoś nie wychodzi ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Vennor Opublikowano 4 Września 2011 Zgłoś Opublikowano 4 Września 2011 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? 1 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
kamail86 Opublikowano 4 Września 2011 Zgłoś Opublikowano 4 Września 2011 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...