metoda klasy string zwracajaca referencje do obiektu tej klasy.
Ostatnio zmodyfikowano 2016-11-16 23:37
mateczek |
» 2016-11-16 01:17:01 basic_string & insert( size_type index, size_type count, CharT ch ); Działą tak jak klasa którą Ci przedstawiłem. coś robi na obiekcie i zwraca referencję do obiektu na rzecz którego pracuje. #include <iostream> #include<string> using namespace std; int main() { string s = { "Ala ma tygrysy" }; cout << s.insert( 7, "2 " ) << endl; }
|
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-11-16 01:24:59 Ale czy ta metoda tworzy tą nową tablice? Bo w klasie przedstawionej przez Ciebie modyfikujemy składnik i zwracamy referencję do obiektu, a tu (z tego co zrozumiałem) tworzymy nową tablicę, przepisuje do niej tekst z naszym dodanym fragmentem innego cstringa i zwracamy referencję do obiektu. Tylko co teraz? Mamy dwie tablice? Czy tamta stara jest usuwana a ta zajmuje jej miejsce? |
|
mateczek |
» 2016-11-16 01:32:36 jeśli chcesz zobaczyć jak zrobić poszerzającą się tablice. Czyli coś na wzór klasy Vector to był już taki wątek. I nie ma to nic wspólnego z zwrotem referencji do obiektu !!! http://cpp0x.pl/forum/temat/?id=23897&p=2 #include <iostream>
class mTablica { int rozmiar; int indexZapelneienia; int * tab; int base = 10; public: mTablica() { tab = new int[ base ]; rozmiar = base; indexZapelneienia = 0; } ~mTablica() { delete[] tab; } void pusback( int element ); int & operator []( int index ); int size() { return indexZapelneienia; } };
void mTablica::pusback( int element ) { if( indexZapelneienia >= rozmiar ) { int * temp = new int[ rozmiar + base ]; for( int i = 0; i < rozmiar; i++ ) { temp[ i ] = tab[ i ]; } delete[] tab; tab = temp; rozmiar = rozmiar + base; } tab[ indexZapelneienia++ ] = element; }
int & mTablica::operator []( int index ) { return tab[ index ]; }
using namespace std;
int main() { mTablica tab; for( int i = 0; i < 35; i++ ) { tab.pusback( i ); } tab[ 25 ] = 333; for( int i = 0; i < tab.size(); i++ ) { cout << tab[ i ] << " "; } } A każda metoda, która nie ma nic do zwracania może w ramach wykorzystania wolnego czasu zwrócić referencje do this. W przedstawionym kodzie jedyna, która się do tego nadaje to metoda "void pusback()" wystarczy dopisać return *this; i po sprawie :P // tak by to wyglądało mTablica & mTablica::pusback( int element ) { if( indexZapelneienia >= rozmiar ) { int * temp = new int[ rozmiar + base ]; for( int i = 0; i < rozmiar; i++ ) { temp[ i ] = tab[ i ]; } delete[] tab; tab = temp; rozmiar = rozmiar + base; } tab[ indexZapelneienia++ ] = element; return * this; } na pytanie dlaczego zwracać referencję do "this" jest kilka odpowiedzi. 1 bo można 2 bo to prawie nic nie kosztuje "return *this;" 3 bo wywołania taśmowe są zajebiste. No chyba, że ktoś lubi taki kod jak niżej w 4 liniach klepać cout << "ala ma" << lie << " koty" << endl; |
|
michal11 |
» 2016-11-16 08:31:30 insert w stringu nic nie tworzy tylko (tak jak nazwa wskazuje) wstawia do stringa znak/tekst na podanej pozycji, prototypowo wygląda to mniej więcej tak: string & insert( size_t pos, const string & str ) { char * newArr = new char[ size() + str.size() ]; for( int i = 0; i < pos; ++i ) { newArr[ i ] = _internalBuff[ i ]; } for( int i = pos; i < pos + str.length(); ++i ) { newArr[ i ] = str[ i ]; } for( int i = pos + str.length(); i < length() + str.length(); ++i ) { newArr[ i ] = _internalBuff[ i - str.length() ]; } delete[] _interalBuff; _internalBuff = newArr; return * this; }
Od razu uprzedzam bardziej zaawansowanych forumowiczów, że to jest tylko uproszczony schemat dla @latajacaryba i zdaję sobie sprawę, że faktycznie to wygląda zupełnie inaczej, ale koncepcja jest zapewne podobna. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-11-16 23:37:54 Dobra, przeanalizowałem. Z tego co zrozumiałem, to funkcja mogłaby być równie dobrze void, ale dzięki temu, że zwraca this możemy zrobić tak (przykład): string ala = "alama"; string kot = "kota";
cout << ala.insert( 5, kot );
ala.insert( 5, kot ); cout << ala;
Racja? |
|
1 2 « 3 » |