Was Sie wollen, ist ein Nur-Lese-Zugriff, ohne den gesamten Datenblock zu kopieren. Sie haben ein paar Möglichkeiten.
Erstens könnten Sie einfach eine const-Referenz auf Ihren Datencontainer zurückgeben, wie oben vorgeschlagen:
const std::vector<T>& getData() { return mData; }
Dies hat den Nachteil der Konkretheit: Sie können nicht ändern, wie Sie die Daten intern speichern, ohne die Schnittstelle Ihrer Klasse zu ändern.
Zweitens können Sie const-ed-Zeiger auf die eigentlichen Daten zurückgeben:
const T* getDataAt(size_t index)
{
return &mData[index];
}
Dies ist ein bisschen netter, erfordert aber auch, dass Sie einen getNumItems-Aufruf bereitstellen und gegen Out-of-Bounds-Indizes schützen. Auch ist die const-ness Ihrer Zeiger leicht weggeworfen, und Ihre Daten sind jetzt lesen und schreiben.
Eine andere Möglichkeit besteht darin, ein Paar Iteratoren bereitzustellen, was allerdings etwas komplexer ist. Dies hat die gleichen Vorteile von Zeigern, sowie nicht (notwendigerweise) brauchen, um eine getNumItems Aufruf bieten, und es gibt erheblich mehr Arbeit beteiligt, um die Iteratoren von ihrer const-ness zu entfernen.
Am einfachsten lässt sich dies wahrscheinlich durch die Verwendung einer Boost Range bewerkstelligen:
typedef vector<T>::const_iterator range_iterator_type;
boost::iterator_range< range_iterator_type >& getDataRange()
{
return boost::iterator_range(mData.begin(), mData.end());
}
Dies hat den Vorteil, dass die Bereiche zusammensetzbar, filterbar usw. sind, wie Sie auf der Seite Website .