Referencja, wskaźnik i referencja na wskaźnik

0

Mam taką oto deklarację funkcji:

Court::CHECK_COURT_RESULT findCourt(Signature &sg,  const std::wstring &closeBeforePart, const Court*& crt, const stools::DateTime& issuanceDate) const;

Jakieś tam jej wywołanie:

Court *crt = NULL; 
courtRes = findCourt(sig,closePart,crt,lnk.getActionTime());

I błąd, który pojawił się po konwersji z VS2003 na VS2008:

cannot convert parameter 3 from 'Court *' to 'const Court *&'

Robiąc rozeznanie w temacie trafiłam na fajny topik na forum, gdzie ziom dokładnie wyjaśnia różnice między referencją a wskaźnikiem a przy okazji podaje też takie coś:

short *w;
short *&r=w; // r jest referencją na w

int a=3,b=4;
void swap(int *x,int *y) { int t=*x; *x=*y; *y=t; } // zamiana wartości przez wskaźniki
void swap(int &x,int &y) { int t=x; x=y; y=t; } // zamiana wartości przez referencje
swap(&a,&b); // wywołanie funkcji zamiany wartości przez wskaźniki
swap(a,b); // wywołanie funkcji zamiany wartości przez referencje

Ha, ale jak wywołać funkcję, która jako parametr przyjmuje referencję na wskaźnik? :)
Kombinowałam z:

Court *crt = NULL; 
courtRes = findCourt(sig,closePart,&crt,lnk.getActionTime());

Ale to daje oczywiście błąd, cannot convert parameter 3 from 'Court **' to 'const Court *&'

1

Po pierwsze to nie jest stała referencja do wskaźnika do Court (czyli stosowana tak, jak w przypadku innych parametrów), ale referencja do stałego wskaźnika do Court. Czyli wartość zmiennej crt (z funkcji) może ulec zmianie, ale nie można przez niego zmienić wartości na którą wskazuje. Jako, że ten parametr służy odbiorowi danych, to zmień definicję crt przy wywołaniu funkcji na const Court* crt=NULL.

BTW Czeka Ciebie dużo roboty z tłumaczeniem tego na C#.

0

Zdaje mi się, że const-correctness się kłania.

Edit:
Za późno :p

1

rozwiązanie:
zamień Court *crt = NULL; na:
const Court *crt = NULL;

problem:
tamta metoda zwraca przez referencję wskaźnik na stały obiekt. U Ciebie wskaźnik crt jest wskaźnikiem na zmienny obiekt (obiekt, który można zmieniać). Jeśli tamta metoda findCourt jest Twoja i chcesz przyjąć w parametrze obiekt, którego nie chcesz modyfikować powinnaś zapisać:

Court::CHECK_COURT_RESULT findCourt(Signature &sg,  const std::wstring &closeBeforePart, const Court& crt, const stools::DateTime& issuanceDate) const;
lub
Court::CHECK_COURT_RESULT findCourt(Signature &sg,  const std::wstring &closeBeforePart, const Court* crt, const stools::DateTime& issuanceDate) const;

Jeśli koniecznie chcesz móc zmieniać zwrócony obiekt powinnaś zastosować const_cast, co nie jest zalecane :)

0

No cóż. Winny nie jest VS2008, tylko VS2003, bo ten kod nie powinien był się w ogóle kompilować.

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