Mam klasy Foo
który jest w drzewiastej strukturze własny odsyłania (minimalnie):Czy powinienem const_cast "to", gdy metoda akceptuje tylko Foo * const?
class Foo {
public:
// Gets this child's position relative to it's parent.
int getPosition() const {
return parent->indexOf(this);
}
int indexOf(const Foo *const child) const {
return children.indexOf(child); // this line causes an error.
}
private:
Foo *parent;
QList<Foo *> children;
}
Linia return children.indexOf(child)
oczekuje const T &value
być przekazywane zgodnie z QList docs, ten postanawia Foo *const &value
dla mojego scenariusza.
Aby moim getPosition()
metody zadzwonić własną indexOf()
metody jest to wymagane, aby mieć podpis const Foo *child
na minimum w celu przekazania this
z metody const. (Ponieważ jest to const Foo *const
).
Mój kod nie zostanie skompilowany, ponieważ jako const Foo *const child
nie można przesłać do Foo *const child
dla QList::indexOf
. Żadna z moich metod nie modyfikuje stanu obiektu, więc powinny one być stałe (tj. Nie chcę, aby nie kosztować getPosition
, aby otrzymać niestanowiący this
).
Pytanie brzmi, jak przejść od this
w kontekście const (const Foo *const
) do tego, czego wymaga QList::indexOf
. Czy powinienem rzucać const this
wewnątrz getPosition
, ponieważ wiem, że moje indexOf
(i kolejne wywołania) nie będą go mutować?
Czy jest coś jeszcze, co powinienem był zrobić? Być może mój projekt jest wadliwy.
Czy prawdziwy problem polega na tym, że 'QList :: indexOf' nie jest metodą' const' i powinno być? – David
Nie sądzę, że jest coś, co mógłbyś zrobić lepiej. Jeśli cokolwiek, projekt 'QList' może zostać ulepszony, aby umożliwić argumentowi wyszukiwania cokolwiek, co może być równe w porównaniu do jego typu elementu. Poszukiwanie "Foo const *" nie stanowiłoby problemu. Ale zakładam, że nie jesteś projektantem 'QList'. – celtschk
@Dave 'QList :: indexOf' jest metodą const. http://qt-project.org/doc/qt-5.0/qtcore/qlist.html#indexOf –