[C/C++] Klasa, metoda

0

Witam.
Jestem początkujący jeżeli chodzi o programowanie obiektowe a dostałem dosyć "ambitne" (jak na mój poziom zadanie)... Czy mógłby ktoś się wypowiedzieć czy podany fragment kodu jest poprawny oraz jako można go napisać poprawniej (jestem prawie pewny, że coś jest w nim źle). Chodzi mi głównie o operator rzutowania z const char* na char* (ogl nie rozumiem czemu też w tym konstruktorze musi być const chars a nie może być chars <wiem, wiem że wywali błąd ale chodzi mi o to skąd to się wzięło>). Proszę o wszelkie sugestie. :) Co do książek to przeczytałem w miarę rozdziały dotyczące klas jednak po przejściu do praktyki mam trochę problem(może nie czytałem zbyt uważnie :/ ) zatem proszę raczej o konkretną pomoc przy programie a nie odpowiedzi w stylu "doczytaj". Dziękuję za wszystkie sugestie. Edit: Wydaje mi się, że to delete też raczej nie zwalnia tej pamięci dobrze (?)


class String {
    char* s_;
public:

    /*Konstruktory*/

    String(const char* s);
    void wyswietlenie()
    {
        cout<<s_<<endl;
    }
   /*Destruktor*/
    ~String();

};
String::String(const char*s)
{
    cout<<"Dziala konstruktor char*s"<<endl;
    int i;
    for(i=0;s[i]!='\0';i++); //może da się jakoś inaczej określić rozmiar? - sizeof()????
    i++;
    cout<<i<<endl;
    s_=new char[i];
    s_=(char*)s;
}
String::~String()
{
    cout<<"Teraz dziala destruktor"<<endl;
    delete[] s_;
}
int main() {
    using std::cout; using std::endl; using std::boolalpha;
    String s="Tekst sprawdzajacy ";
    s.wyswietlenie();
}

1
#include <iostream>
#include <cstring>

// XXX: Uwaga. W całym tym kodzie nie sprawdzasz "złośliwych przypadków" przekazania
// null'a. Ale nie to jest jak zrozumiałem przedmiotem Twoich starań.
// XXX: Na razie tak będzie łatwiej.
using namespace std;

class String {
    // XXX: Raczej, częstszym zwyczajem jest umieszczanie części prywatnej 
    // po częsci publicznej. Czasem się nie da (lub jest ... niewygodnie)
    // ale nie w tym przypadku.
    //char* s_;
public:
    /*Konstruktory*/
    // XXX: Przyda się konstruktor bez argumentów
    String();
    String(const char* s);
    // XXX: Przydają się także operatory przypisania z c-string'a oraz
    // z String a także operator kopiowania z const String&.
    // Zostawiam to jednak Tobie.
    // XXX: Tu dodaj const bo wyświetlanie nie zmienia atrybutów w klasie
    // Następna rzecz to konsekwencja. Tu nie ma powodu aby implementacji
    // nie umieścić jak konstr. i destr. poza definicją.
    void wyswietlenie() const;
   /*Destruktor*/
    ~String();
private:
    char * s_;
};

// XXX: Używaj list inicjalizacyjnych
String::String() : s_{new char[1]} {
    cout << "Działa konstruktor bez argumentów" << endl;
}
String::String(const char*s) : s_{new char[strlen(s) + 1]}
{
    cout << "Dziala konstruktor const char*s" << endl;
    // XXX: Kopiowanie c-string'a 
    strcpy(s_, s); 
}

String::~String()
{
    couti << "Teraz dziala destruktor" << endl;
    // XXX: To jest dobrze
    delete[] s_;
}

void String::wyswietlenie() const
{
    cout << s_ << endl;
}
int main() {
    // XXX: Jeśli bardzo chcesz (lub ktokowliek wymaga) można i tak. Ale w tym przykładzie
    // prościej na razie globalnie otworzyć namespace std;
    //
    /*
    using std::cout;
    using std::endl;
    using std::boolalpha;
    */
    String s1 = "Tekst sprawdzajacy ";
    s1.wyswietlenie();
    String s2;
} 

PS. Przeczytaj o "Regule trzech" https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)

0

nie rozumiem czemu też w tym konstruktorze musi być const chars a nie może być chars

Bo literał znakowy ma typ const char*, więc gdyby konstruktor przyjął char* to nie mógłbyś pisać

String s="Tekst sprawdzajacy ";

> może da się jakoś inaczej określić rozmiar?

strlen()

Nie komentuj takich oczywistych rzeczy

/*Konstruktory*/
/*Destruktor*/

```cpp s_=(char*)s; ```

To jest przypisywanie wskaźnika. Konsekwencją tego jest utrata dostępu do nowo zaalokowanej pamięci i wskazywanie na jakieś cudze napisy. Do kopiowania ciągu znakowego zakończonego nullem jest strcpy().

1 użytkowników online, w tym zalogowanych: 0, gości: 1