Atrybut klasy tylko do odczytu

Odpowiedz Nowy wątek
2011-08-11 19:12
0

Witam!

Szukałem ostatnio sposobów na stworzenie atrybutów klasy tylko do odczytu. Trafiłem na (podobny) kawałek kodu:

class B {
private:
    int v_x;
public:
    const int &x;
 
    void setX(int wartosc) { v_x = wartosc; }
 
    B() : v_x(15), x(v_x) {
    };
};
 
int main() {
 
    B b;
    std::cout << b.x << '\n'; // 15
 
    // b.x = 1; bład kompilacji! (prawidłowo)
    b.setX(1);
    std::cout << b.x << '\n'; // 1
 
    // b.x = 12; bład kompilacji! (prawidłowo)
    return 0;
}

Jak widać tworzymy publiczna const referencję do prywatnego nie-const obiektu.
Sprawdza się świetnie.

Jednakże, gdy próbuję rozciągnąć taką funkcjonalność na C-string'i:

class B {
public:
    char* v_y;
public:
    const char* &y;
 
    void setV(char* wartosc) { strncpy(v_y, wartosc, 14); }
 
    B() : y((const char*&)v_y) { // również nie jestem pewny, czy uciekanie się tu do cast'owania jest poprawne. inaczej kompilator zgłasza błąd
        v_y = new char[15];
        strcpy(v_y, "tekst");
    };
};
 
using namespace std;
int main() {
 
    B b;
 
    std::cout << b.y << std::endl; // "tekst"
    // strcpy(b.y, "string"); // Błąd kompilacji! (jednak inny niż oczekiwany)
    // *b.y = 'p'; // Błąd kompilacji! (oczekiwany: "assignment of read-only location")
    b.setV("string");
    std::cout << b.y << std::endl; // "string"
 
    b.y = new char[15]; // dlaczego kompilator na to pozwala?!
    std::cout << b.y << std::endl; // # krzaczki! #
 
    return 0;
}

Jak widać, kompilator dopuszcza operację

b.y = new char[1]; 

Zgłasza protest dopiero przy

 *b.y = 'p'; 

Czy jest jakiś spobób, by temu zapobiec?
By uzyskać read-only C-stringi ?
By nie pozwolić na nadpisywanie ptr'a do tablicy?

Jestem pewien, że coś mi umyka, jednak nie jestem w stanie stwierdzić - co...

Z góry bardzo dziękuję za odpowiedzi!

edytowany 2x, ostatnio: 4ggr35510n, 2011-08-11 19:13

Pozostało 580 znaków

2011-08-11 19:43
0

Na to jest tylko jedna w miarę pewna metoda-zdeklarować zmienną prywatnie i dopisać funkcję akcesora do niej zwracającą const typ&.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

2011-08-12 06:49

Rozwiązaniem Twojego problemu jest:
char const * const &y;
W Twoim kodzie zabrakło drugiego const'a. Pierwszy const sprawia, że nie możesz zmienić wartości pod wskaźnikiem, a drugi że nie możesz zmienić wartości wskaźnika.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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