Zwracanie nie-stałego ciągu znaków poprzez stałą metodę

0

Jako iż doktor (sic!) na uczelni popełnia tak rażące błędy i nie potrafi ich wytłumaczyć (wykłady prowadzi w wordzie, chyba celowo, żebyśmy nie zauważyli błędów w kodzie) to zwracam się do kompetentnych osób tutaj.
Sytuacja jest następująca: mamy prostą klasę, w której mamy prywatny składnik, który jest tablicą znaków o określonym rozmiarze. I mamy typowego gettera, który zwraca tą tablice, z zaznaczeniem, że jest to metoda, która nie zmienia składnika, czyli metoda const. No i doktor pisze tak:

class Klasa
{
    char tekst[ 20 ];
public:
    char * getTekst() const;
};

char * Klasa::getTekst() const
{
    return tekst;
}

Co wywala błąd. Natomiast poprawiłem ten kod, żeby działał co można zrobić np w ten sposób.

class Klasa
{
    char * tekst;
public:
    char * getTekst() const;
};

char * Klasa::getTekst() const
{
    return tekst;
}

Można też zostawić char tekst[20], ale usunąć const z nagłówka funkcji, wtedy też zadziała.
Pytanie moje jest następujące: dlaczego z technicznego punktu widzenia ta druga metoda działa, a pierwsza nie?

3

W pierwszym przypadku wewnątrz const metody masz wskaźnik na const tablicę charów, co "decayuje" do wskaźnika na const char.

W drugim przypadku masz const wskaźnik na nie-const dane i zwracasz jego kopię.

class Klasa1
{
    char tekst[ 20 ];
public:
    char * getTekst() const;
};

char * Klasa1::getTekst() const
{
    auto ptr = tekst;
    static_assert(is_same_v<const char**, decltype(&ptr)>);
    return {};
}
class Klasa2
{
    char * tekst;
public:
    char * getTekst() const;
};

char * Klasa2::getTekst() const
{
    static_assert(is_same_v<char* const*, decltype(&tekst)>);
    return {};
}

Tutaj to faktycznie bardzo mało intuicyjne. Rozumiem, że to dywagacje akademickie, ale skoro sam poszerzasz swoją wiedzę to popatrz na std::string i std::string_view. Powyższy kod prawdopodobnie nie przeszedłby code review w żadnej poważnej firmie.

0

Rozumiem. Dziękuje za odpowiedź.
I tak, są to tylko akademickie dywagacje, wiadomo, że takie sytuacje powinno się rozwiązywać na stringach, ale wykładowca zatrzymał się w latach 90. i musimy korzystać wyłącznie z typu char, nie wspominając o programowaniu na kartkach papieru jako prace domowe czy prowadzeniu wykładów pisząc kod w Wordzie zamiast w jakimś środowisku. Tak niestety wygląda nauka na jednej z niby lepszych politechnik w tym kraju. Nie będę mówił, która to konkretnie, ale mam szczerą nadzieję, że nie wszędzie tak to wygląda.

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