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!