In C ++ diciamo che ho qualche classe A:
Class A
{
int a1, a2, a3;
void foo();
}
e ho bisogno di usare un sottoinsieme di membri (a1, a2) in una funzione membro per una seconda classe B.
Quello che mi chiedo è se dovrei definire gli argomenti della funzione membro di B passando un puntatore ad A come argomento, o se dovrei passare i membri di A come argomenti. per es.,
Class B
{
int b1, b2;
void bar(A &a);
}
o dovrebbe essere
Class B
{
int b1, b2;
void bar(int a1, int a2);
}
Quest'ultimo sembrerebbe minimizzare di dover violare l'incapsulamento, perché B può quindi essere in gran parte agnostico sui costituenti di A; mentre nel primo caso B dovrebbe sapere qualcosa sui membri di A. Quindi sembrerebbe preferibile la seconda implementazione.
Un altro motivo per cui la prima implementazione mi sembra problematica è che, idealmente, mi piacerebbe mantenere i membri (a1, a2, a3) di A protetti piuttosto che pubblici. Normalmente sarei tentato di fare di B una classe amica di A, ma il problema qui è che A e B hanno entrambe entrambe diverse classi derivate, e poiché l'amicizia non eredita in C ++ non sembra essere una buona soluzione.
Quindi questi motivi potrebbero sostenere l'utilizzo di qualcosa come la seconda definizione di B. Tuttavia, nel codice reale che sto trattando, ci sono alcuni (circa 6 o più) membri di A che B richiederà, quindi questo potrebbe diventare poco maneggevole. Essere in grado di passare semplicemente un puntatore a A sembra preferibile da un punto di vista di leggibilità e nascondere i dettagli di ciò che richiede B.bar () da altre parti del codice che trattano di B.
Forse una soluzione potrebbe essere quella di avere metodi in A che facciano qualcosa del tipo: A::get_a1() {return this->a1}
o qualcosa del genere, ma non sono nemmeno sicuro se questa sia davvero la soluzione di design corretta qui.