Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс для работы со строками. 
:(
    Опции темы
Mal Hack
Дата 21.5.2006, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 2
Всего: 261



bsa, как в твоем примере надо делать вызов?
Пишу:
Код
Str1  += (String &)Str2;

Получаю ошибку:
Цитата
error C2677: binary '+=' : no global operator found which takes type 'String' (or there is no acceptable conversion)
 
PM ICQ   Вверх
Mal Hack
Дата 29.5.2006, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 2
Всего: 261



chipsetbsaJossUnrealMan, благодарю за помощь.

Вот что получилось:

Код
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>

class String
{
    private:
        int       Len;
        char * Str;
    public:
        String( void );
        String( char ch );
        String( char * s );
        String( char & s );

        char & operator [] ( int index );

        String & operator =  ( const String & s );
        String & operator += ( const String & s );
        String & operator +  ( const String & s );

        bool operator == ( const String & s );
        bool operator != ( const String & s );
        bool operator <= ( const String & s );
        bool operator >= ( const String & s );
        bool operator <  ( const String & s );
        bool operator >  ( const String & s );

        char * GetString( void );
        int GetLength( void );
        String & SubString( int StartIndex );
        String & SubString( int StartIndex , int Length );
        int IndexOf( const String & s );

        ~String();
};

String::String( void )
{
    this->Str = "";
    this->Len = 0;
}

String::String( char ch )
{
    this->Str = (char *) malloc( sizeof( char ) );
    this->Str = ( char * )ch;
    this->Len = 1;
}

String::String( char * s )
{
    this->Str = (char *) calloc( strlen( s ) , sizeof( char ) );
    this->Str = ( char * ) s;
    this->Len = this -> GetLength();
}

String::String( char & s )
{
    this->Str = (char *) calloc( strlen( &s ) , sizeof( char ) );
    this->Str = & s;
    this->Len = this -> GetLength();
}

int String::GetLength( void )
{
    return strlen( this -> Str );
}

char * String::GetString( void )
{
    return this -> Str;
}

bool String::operator == ( const String & s )
{
    return this->Len == s.Len && 0 == strcmp( this->Str , s.Str );
}

bool String::operator != ( const String & s )
{
    return this->Len != s.Len || 0 != strcmp( this->Str , s.Str );
}

bool String::operator >= ( const String & s )
{
    return this->Len >= s.Len && 0 <= strncmp( this->Str , s.Str , this->Len );
}

bool String::operator <= ( const String & s )
{
    return this->Len <= s.Len && strncmp( this->Str , s.Str , this->Len ) <= 0;
}

bool String::operator >( const String & s )
{
    return this->Len > s.Len && 0 < strncmp( this->Str , s.Str , this->Len );
}

bool String::operator < ( const String & s )
{
    return this->Len < s.Len && 0 > strncmp( this->Str , s.Str , this->Len );
}

String & String::SubString( int StartIndex )
{
    String *st = new String();

    if( StartIndex >= this->Len )
    {
        return *st;
    }

    st->Str = (char *) malloc( ( this->Len - StartIndex ) * sizeof( char ) );
    st->Len = ( this->Len - StartIndex );

    memcpy( st->Str , this->Str + StartIndex , this->Len );

    st->Str[ ( this->Len - StartIndex ) ] = '\0';

    return *st;
}

String & String::SubString( int StartIndex , int Length )
{
    String *st = new String();

    if( StartIndex + Length >= this->Len )
    {
        return *st;
    }

    st->Str = (char *) malloc( Length * sizeof( char ) );
    st->Len = Length;

    memcpy( st->Str , this->Str + StartIndex , Length );

    st->Str[ Length ] = '\0';

    return *st;

}

int String::IndexOf( const String & s )
{
    int i;

    for ( i = 0 ; i <= this->Len - s.Len ; i++ )
    {
        if ( !strncmp( this->Str + i , s.Str , s.Len ) )
        {
            return i;
        }
    }

    return -1;
}

char & String::operator [] ( int index )
{
    if( index < 0 || index > this -> Len )
    {
        printf( "Неверный индекс i = %d" , index );
        exit( 0 );
    }

    return this -> Str[ index ];
}

String & String::operator + ( const String & s )
{
    String * result = new String( this->Str );

    *result += (String &)s;

    return *result;
}

String & String::operator += ( const String & s )
{
    char    * st = this->Str;
    int         len = this->Len;

    this->Str = (char *) malloc( ( len + s.Len ) * sizeof( char ) );

    Len = strlen( st );
    memcpy( this->Str , st , this->Len );

    memcpy( this->Str + this->Len , s.Str , s.Len );
    Len += s.Len;

    Str[ Len ] = '\0';

    return *this;
}

String & String::operator = ( const String & s )
{
    this->Str = (char *) malloc( s.Len * sizeof( char ) );

    this->Str = s.Str;
    this->Len = s.Len;

    return *this;
}

String::~String()
{
    delete [] Str;
}

void main()
{
    String * Str1 , * Str2 , * Str3 , * Str4 , * Str5;

    Str1 = new String( "123456789" );
    Str2 = new String( "abcdefghi" );
    Str3 = new String();
    Str4 = new String();
    Str5 = new String( "abcdefghi" );

    printf( "Str1 = %s\nStr2 = %s\nStr3 = %s\nStr4 = %s\nStr5 = %s\n\n" , Str1->GetString() , Str2->GetString() , Str3->GetString() , Str4->GetString() , Str5->GetString() );

    *Str3 = (String &)(*Str2) + (String &)(*Str1);

    printf( "Str3 = Str2 + Str1 = \n\t\t\t\t\t\t%s\n" , Str3->GetString() );

    *Str1 += (String &)(*Str2);

    printf( "Str1 += Str2 = \n\t\t\t\t\t\t%s\n" , Str1->GetString() );

    *Str1 = Str1->SubString( 7 );

    printf( "Str1 = Subtring( 7 ) ( Str1 ) = \n\t\t\t\t\t\t%s\n" , Str1->GetString() );

    *Str4 = Str1->SubString( 2 , 4 );

    printf( "Str4 = Subtring( 2, 4 ) ( Str1 ) = \n\t\t\t\t\t\t%s\n" , Str4->GetString() );

    printf( "\nStr1 = %s\nStr2 = %s\nStr3 = %s\nStr4 = %s\nStr5 = %s\n\n" , Str1->GetString() , Str2->GetString() , Str3->GetString() , Str4->GetString() , Str5->GetString() );
    
    printf( "Str2 %s Str1\t" , ( Str2->operator > ( (String &)(* Str1) ) )  ? ">" : "<=" );
    printf( "Str3 %s Str2\t" , ( Str3->operator ==( (String &)(* Str2) ) ) ? "==" : "!=" );
    printf( "Str4 %s Str2\t" , ( Str4->operator !=( (String &)(* Str2) ) ) ? "!=" : "==" );
    printf( "Str5 %s Str2\t" , ( Str5->operator ==( (String &)(* Str2) ) ) ? "==" : "!=" );
    printf( "Str4 %s Str1\t" , ( Str4->operator < ( (String &)(* Str1) ) ) ? "<" : ">=" );
    printf( "Str1 %s Str4\n" , ( Str4->operator > ( (String &)(* Str4) ) ) ? ">" : "<=" );

    printf( "\n" );

    int pos;
    pos = Str1->IndexOf( *Str4 );

    if( pos > 0 )
    {
        printf( "Str4 IndexOf Str1 = %d\t\t" , pos );
    }
    else
    {
        printf( "Str4 IndexOf Str1 = not found\t\t" );
    }

    pos = Str3->IndexOf( *Str2 );

    if( pos > 0 )
    {
        printf( "Str3 IndexOf Str2 = %d\t" , pos );
    }
    else
    {
        printf( "Str3 IndexOf Str2 = not found\t" );
    }

    getch();
    exit(0);
}
 
PM ICQ   Вверх
MAKCim
Дата 30.5.2006, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Код

String & String::operator + ( const String & s )
{
    String * result = new String( this->Str );
    *result += (String &)s;
    return *result;
}


Код

String operator+(const String& str_a, const String& str_b)
{
    String str(str_a);
    str+=str_b;
    return str;
}

+ добавь конструктор копий
Код

String::String(const String& obj)
{
    int size=obj.GetLength();
    Str=new char [size];
    Len=size;
    for (int i=0; i<size; ++i) *(Str+i)=*(obj.Str+i);
}

а то тут будет ошибка
Код

void F(String str) {}

int main()
{
    String str("Test");
    F(str)
    return 0;
}

Цитата

Код

String::String( char * s )
{
    this->Str = (char *) calloc( strlen( s ) , sizeof( char ) );   // Можно new выделять
    this->Str = ( char * ) s;        // Зачем приведение?? + утечка памяти + возможно двойное удаление, нужно   //                      strncpy(this->Str,s,strlen(s));
    this->Len = this -> GetLength(); 
}


Цитата

Код

String::String( char ch )
{
    this->Str = (char *) malloc( sizeof( char ) );
    this->Str = ( char * )ch;     // Берем адрес объекта в стеке (после отработки конструктора Str будет ссылаться)
    this->Len = 1;                     // на невалидный объект + утечка памяти
}


Цитата

Код

int String::GetLength( void )
{
    return strlen( this -> Str ); // Крайне неэффективно, лучше один раз вычислить вначале и сохранить в Len
}



Добавлено @ 09:08 
Цитата

Код

String & String::operator = ( const String & s )
{
    this->Str = (char *) malloc( s.Len * sizeof( char ) );
    this->Str = s.Str;          // Опять утечка памяти + двойное удаление
    this->Len = s.Len;
    return *this;
}



Mal Hack
если есть
Код

char* str;

и он указывает на строку
то при
Код

char* a=str;

и a и str указывают на одну область памяти
в деструкторе String эта область освобождается, но освобождается в 2-ух объектах сразу!!, что приведет к ошибке 

Это сообщение отредактировал(а) MAKCim - 30.5.2006, 09:03


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Mal Hack
Дата 30.5.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 2
Всего: 261



Цитата(MAKCim @  30.5.2006,  09:02 Найти цитируемый пост)
в деструкторе String эта область освобождается, но освобождается в 2-ух объектах сразу!!, что приведет к ошибке 

Это вроде бы обработали.
Задача - учебная. Тут все проще надо делать. 
PM ICQ   Вверх
MAKCim
Дата 30.5.2006, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Тут все проще надо делать.

я же не предлягаю ее усложнить  smile 
просто тут не совсем все правильно 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Mal Hack
Дата 30.5.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 2
Всего: 261



Не спорю. Во внимание все приму. 
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1089 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.