Jeśli to możliwe, to lepiej ustawić członków danych poprzez listę inicjatora, w takim przypadku nie ma problemu z argumentami, że nazwy członków shadow. Inną alternatywą jest użycie this->foo = foo;
w ciele konstruktora. Podobny problem występuje w ustawiaczach, ale teraz nie można użyć rozwiązania listy inicjalizacyjnej. Utknąłeś z this->foo = foo;
- lub po prostu używaj różnych nazw dla argumentów i członków.
Niektórzy ludzie naprawdę nienawidzą argumentów, które śledzą członków danych; wiele standardów kodowania wyraźnie mówi, że nigdy tego nie robi. Inni uważają, że ten rodzaj cieniowania, przynajmniej dla konstruktorów i seterów, jest miauczeniem kota. Przypominam sobie przeczytanie jednego lub dwóch standardów kodowania (ale nie pamiętam, który), który wyznaczył ten rodzaj cieniowania jako "powinien" (ale nie "powinien") praktykę.
Ostatnią opcją jest użycie cieniowania w deklaracji funkcji, aby dać czytelnikom wskazówkę co do funkcji, ale użyć różnych nazw w implementacji.
Aktualizacja: Co to jest "shadowing"?
#include <iostream>
void printi (int i) { std::cout << "i=" << i << "\n"; }
int i = 21;
int main() {
printi (i);
int i = 42;
printi (i);
for (int i = 0; i < 3; ++i) {
printi (i);
int i = 10;
printi (i);
}
printi (i);
}
Głębsza deklaracja i
, int i=10
, cienie zmienną i
zadeklarowaną w oświadczeniu for
, co z kolei cienie zmienną i
zadeklarowana w zakresie funkcji, które z kolei cienie zmienną globalną i
.
W problemu pod ręką, argumenty x
, y
, width
, a height
do non-domyślnego konstruktora dla klasy A
cienia dane członkowskie o tych samych nazwach jak te argumenty.
Twoja width=width;
nic nie zrobiła, ponieważ argument width
cienie (ukrywa) element danych width
. Jeśli masz dwie lub więcej zmiennych o tej samej nazwie, które zostały zadeklarowane w różnych zakresach, zwycięzcą jest zawsze nazwa z najgłębszym zakresem. Ogólnie rzecz biorąc, zawsze wygrywa nazwa o najgłębszym zasięgu.
Euh, dołączając 'a' do nazw argumentów? –
'A :: A (int xa, int ya, int widtha, int heighta)' – corazza
jeśli chcesz być elegancki, * pre * pend "a", tworząc angielski nieokreślony artykuł: 'anX, aY, aWidth, aHaight' itp. Oczywiście ten sam identyfikator nie może być użyty w odniesieniu do dwóch różnych zmiennych w tym samym zakresie. Zobacz moją odpowiedź. –