Нет необходимости динамически выделять объект типа std :: string. Это просто плохая идея.
Я не знаю, как выглядит класс smartReverse
, но вот его упрощенная версия, которая имеет только одну функцию-член rev_recursive
, которая переворачивает сохраненную строку.
#include <iostream>
#include <string>
class smartReverse
{
public:
smartReverse( const std::string &s ) : s( s ) {}
std::string rev_recursive()
{
if ( s.size() < 2 ) return s;
char first = s.front(), last = s.back();
s = s.substr( 1, s.size() - 2 );
return s = last + rev_recursive() + first;
}
private:
std::string s;
};
int main()
{
smartReverse obj( "Hello Brennen Green" );
std::cout << obj.rev_recursive() << '\n';
return 0;
}
Вывод программы:
neerG nennerB olleH
Если функция должна быть функцией-постоянным членом, ее реализация может выглядеть следующим образом
#include <iostream>
#include <string>
class smartReverse
{
public:
smartReverse( const std::string &s ) : s( s ) {}
std::string getString() const
{
return s;
}
std::string rev_recursive() const
{
if ( s.size() < 2 ) return s;
char first = s.front(), last = s.back();
return last + smartReverse( s.substr( 1, s.size() - 2 ) ).rev_recursive() + first;
}
private:
std::string s;
};
int main()
{
smartReverse obj( "Hello Brennen Green" );
std::cout << obj.getString() << '\n';
std::cout << obj.rev_recursive() << '\n';
return 0;
}
Вывод программы:
Hello Brennen Green
neerG nennerB olleH
Обратите внимание на то, что используемый подход более эффективен, чем когда только один символ удаляется из начала строки и затем добавляется в конец, потому что в используемом подходе число рекурсий меньше или равно s.size() / 2
исходной строки.