Atrybut klasy tylko do odczytu

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!

0

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

1

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.

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