c++ pointer do prywatnego membera

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
clansman5
Sędziwy Jeż
Sędziwy Jeż
Posty: 77
Rejestracja: 06 sty 2009, 10:59
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

c++ pointer do prywatnego membera

Post autor: clansman5 »

Mam sytuacje ktora najprosciej zobrazowac ponizszym przykladem:

Kod: Zaznacz cały

#include <iostream>

using namespace std;

class abc
{
	int *a;

public:
	abc() { a = new int; *a = 0; }
	~abc() { delete a; }

	int* give_ptr() { return a; };
	void print() { cout << "a: [" << (*a) << "]" << endl; }
};

int main()
{
	abc o;
	int *b = o.give_ptr();

	o.print();
	(*b) = 8;
	o.print();

	return 0;
}
Pytanie, czy cos takiego jest "w granicach dobrych praktyk" czy raczej powinno sie unikac tego typu konstrukcji. W realnym kodzie mam klase dziedziczaca po abc ktora wczytuje zawartosc tego przykladowego (int *a) bufora z pliku (za pomoca ifstream::read) ale poniewaz klasy potomne nie maja dostepu do danych prywatnych wymyslilem cos takiego.

Moze jest jakas bardziej "czysta" metoda na rozwiazanie tego problemu?
Awatar użytkownika
Struchu
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 116
Rejestracja: 23 mar 2008, 19:58
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: c++ pointer do prywatnego membera

Post autor: Struchu »

A nie możesz zadeklarować a jako składowej chronionej? Wtedy klasy potomne będą miały do niej dostęp.
Ma zielone, kocie oczy...
clansman5
Sędziwy Jeż
Sędziwy Jeż
Posty: 77
Rejestracja: 06 sty 2009, 10:59
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: c++ pointer do prywatnego membera

Post autor: clansman5 »

jest to jakies wyjscie ale staram sie unikac protected rowniez ze wzgledu na styl
kklimonda
Zakręcona Traszka
Zakręcona Traszka
Posty: 585
Rejestracja: 20 kwie 2008, 04:21
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME

Odp: c++ pointer do prywatnego membera

Post autor: kklimonda »

Jeżeli nie chcesz używać protected które by w tym przypadku miało sporo sensu to lepszym rozwiązaniem od tego co robisz jest napisać metody pobierające i ustawiające a. Twoje rozwiązanie kłóci się z jedną z zasad programowania obiektowego, enkapsulacją. Teraz równie dobrze możesz tego inta jako zmienną publiczną dać i nie będziesz musiał (1) pisać dodatkowej metody i bawić się wskaźnikiem.
clansman5
Sędziwy Jeż
Sędziwy Jeż
Posty: 77
Rejestracja: 06 sty 2009, 10:59
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: c++ pointer do prywatnego membera

Post autor: clansman5 »

kklimonda pisze:Jeżeli nie chcesz używać protected które by w tym przypadku miało sporo sensu to lepszym rozwiązaniem od tego co robisz jest napisać metody pobierające i ustawiające a. Twoje rozwiązanie kłóci się z jedną z zasad programowania obiektowego, enkapsulacją. Teraz równie dobrze możesz tego inta jako zmienną publiczną dać i nie będziesz musiał (1) pisać dodatkowej metody i bawić się wskaźnikiem.
Metody pobierajace i ustawiajace "a" - jak najbardziej sie zgadzam, ale jak w tym przypadku dostarczyc do ifstream::read wymagany obszar pamieci ?
kklimonda
Zakręcona Traszka
Zakręcona Traszka
Posty: 585
Rejestracja: 20 kwie 2008, 04:21
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME

Odp: c++ pointer do prywatnego membera

Post autor: kklimonda »

Tzn. musisz się zdecydować czy coś jest prywatne czy dostępne dla klas potomnych czy w ogóle dla wszystkich. Ja myślałem raczej by ifstream::read zamknąć w ramach klasy bazowej i zwrócić wczytaną zawartość pliku.
nwkj
Sędziwy Jeż
Sędziwy Jeż
Posty: 33
Rejestracja: 08 sie 2009, 14:53
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma

Odp: c++ pointer do prywatnego membera

Post autor: nwkj »

clansman5 pisze:jest to jakies wyjscie ale staram sie unikac protected rowniez ze wzgledu na styl
A co jest nie tak z protected?
clansman5
Sędziwy Jeż
Sędziwy Jeż
Posty: 77
Rejestracja: 06 sty 2009, 10:59
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: c++ pointer do prywatnego membera

Post autor: clansman5 »

nwkj pisze:A co jest nie tak z protected?
Ogolnie sam Bjarne Stroustroup - tworca c++ w jakims wywiadzie powiedzial, ze gdyby jeszcze raz projektowal ten jezyk to zrezygnowalby z protected.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 29 gości