#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?
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.
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 ?
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.