Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[c++] собственный класс строк

14K
17 декабря 2007 года
v0lkan0
32 / / 02.03.2007
Вот собственно задача.
Разработайте класс. для представления строки,
которая может содержать только русские символы.
Перегрузите для этого класса следующие операторы: +, +=, [].
в качестве входных данных используйте текстовые файлы.

Фильтрацию строки сделала, но есть один вопрос:
Код:
class StrRus
{
.....
  rusStr(char *s = "")
  {
    stroka=filter(s);
    [COLOR="Red"]delete[] str;[/COLOR]
  }

  char* filter(char* s)
  {
    ....
    char* str=new char[strlen(s)+1];
    ....
    return str;
  }
}


почему str не удаляется в любом из методов класса включая деструктор и конструктор?? (пишу там где красным и в любом из других методов) выдает ошибки:

error C2065: 'str' : undeclared identifier
error C2541: delete : cannot delete objects that are not pointers

Как в таком случае удалить str в том методе откуда вызывается filter ?
360
17 декабря 2007 года
P*t*
474 / / 15.02.2007
Цитата: v0lkan0

 
Код:
stroka=filter(s);
    [COLOR="Red"]delete[] str;[/COLOR]


в stroka записывается указатель на первый символ того что выдаёт filter()
строка не копируется при этом.
поэтому если что-то и нужно удалять - то это то что лежало в stroka раньше

 
Код:
delete[] stroka;
stroka=filter(s);
14K
17 декабря 2007 года
v0lkan0
32 / / 02.03.2007
Вы не правы.
Во первых это конструктор и stroka является пустой.
Во вторых если я сделаю delete[] stroka; то записать инфу из filter(s) я уже не смогу. (винда выдает ошибку и просит закрыть приложение, некоректная работа с памятью)

Я просто спрашиваю, как мне удалить str не в том методе в котором она объявлена, а в том в котором она используется. Такое вообще в принципе должно быть реально, только у меня не получается. Наверное все дело в зоне видимости переменных. Но все таки КАК ЕЕ УДАЛИТЬ???
360
17 декабря 2007 года
P*t*
474 / / 15.02.2007
присваивание строк - это просто присваивание указателей на них.
у тебя str и stroka - указатели на одну и туже строку!
если удалить str, то удалится и stroka.
320
17 декабря 2007 года
m_Valery
1.0K / / 08.01.2007
Вот этой твой кусок кода неправильный - memory leak!
 
Код:
... char* filter(char* s)
  {
    ....
    char* str=new char[strlen(s)+1];
    ....
    return str;
  }...

Эту функцию тебе надо переделать.
350
18 декабря 2007 года
cheburator
589 / / 01.06.2006
Цитата: m_Valery
Вот этой твой кусок кода неправильный - memory leak!
 
Код:
... char* filter(char* s)
  {
    ....
    char* str=new char[strlen(s)+1];
    ....
    return str;
  }...

Эту функцию тебе надо переделать.


Обрати внимание - единственное место, где вызывается функция filter, это конструктор rusStr. Адрес выделенной памяти возвращается конструктору:

 
Код:
stroka=filter(s);

и тот сохраняет ее в stroka, а stroka освобождается в деструкторе (v0lkan0, я прав? В деструкторе освобождаешь ее?). Никакого мемори-лика.
Чтобы было понятнее, давайте представим себе такой код:
 
Код:
char* str=new char[strlen(s)+1];
char *stroka = str;
delete[] stroka;
[color=red]delete[] str;[/color] // ЭТО - ЛИШНЕЕ!

v0lkan0, выделенную тобой красную строку вообще удали. Не нужна она.
P. S. этот код (один-в-один) уже обсуждался недавно в какой-то теме. Почему не продолжили обсуждение там? Зачем новую тему создавать?
14K
28 декабря 2007 года
v0lkan0
32 / / 02.03.2007
Проблема в следующем: в перегрузке operator+ у меня все нормально работает и коректно слаживает две строки объекта что подтверждает вывод на экран (красным), но после return s1; содержимое строки куда-то исчезает и метод get выводит совершенно другую строку (точнее мусор какой-то) причем (зеленым) выводит один мусор, а (синим) уже другой.
Код:
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>
#include <windows.h>

using namespace std;

class rusStr
{
    char *stroka;
    int len;
public:
    rusStr(char *s = "") {
        stroka=filter(s);
        len=strlen(stroka);
    }
    rusStr(rusStr &str)
    {
        len=str.len;
        stroka=new char[len+1];
        strcpy(stroka,str.stroka);
    }
   
    ~rusStr() {delete[] stroka;}

    void get()
    {
        [COLOR="Green"]cout<<stroka<<endl;[/COLOR]
        [COLOR="Navy"]char* x;
        x=new char[strlen(stroka)+1];
        CharToOem(stroka,x);
        cout<<x<<endl;
        delete[] x;[/COLOR]
    }
   
    rusStr operator+(const rusStr str)
    {
        rusStr s;
        s.len=len+str.len;
        s.stroka=new char[s.len+1];
        strcpy(s.stroka,stroka);
        strcat(s.stroka,str.stroka);
        [COLOR="Red"]cout<<s.stroka<<endl;[/COLOR]
        return s;
    }

    [COLOR="Purple"]/*
    rusStr operator+(const rusStr str)
    {
        char* s1;
        s1=new char[len+str.len+1];
        strcpy(s1,stroka);
        strcat(s1,str.stroka);
        cout<<s1<<endl;
        return s1;
    }*/ [/COLOR]
   
    char* filter(char* s)
    {
        char* str;
        int len=strlen(s);
        int j=0;
        int i=0;
        while(i<len)
        {
            if(((s>='а') && (s<='я')) || ((s>='А') && (s<='Я')))
            {
                j++;
            }
            if(s=='\n')
                len--;
            i++;
        }
        str=new char[j+1];
        j=0;
        i=0;
        len=strlen(s);
        while(i<len)
        {
            if(((s>='а') && (s<='я')) || ((s>='А') && (s<='Я')))
            {
                str[j]=s;
                j++;
            }
            if(s=='\n')
                len--;
            i++;
        }
        str[j]=0;
        return str;
    }
};


int main()
{
    rusStr a("qweприветqwe"), b("213мир23"), c=a;
   
    a=a+b;
    a.get();

    return 0;
}

З.Ы. Фиолетовым выделен еще один вариант перегрузки.

Помогите пожалуйста разобраться в этих указателях и выделении памяти. Вообще моя задача звучит так:

Разработайте класс rusStr. для представления строки,
которая может содержать только русские символы.
Перегрузите для этого класса следующие операторы: +, +=, [].
в качестве входных данных используйте текстовые файлы

и подскажите что значит перегрузить [] что именно они должны делать? проверять на конец строки? или что??
14K
28 декабря 2007 года
stimpi
100 / / 04.09.2007
Цитата: v0lkan0
Проблема в следующем: в перегрузке operator+ у меня все нормально работает и коректно слаживает две строки объекта что подтверждает вывод на экран (красным), но после return s1; содержимое строки куда-то исчезает и метод get выводит совершенно другую строку (точнее мусор какой-то) причем (зеленым) выводит один мусор, а (синим) уже другой.
Код:
rusStr operator+(const rusStr str)
    {
        rusStr s;
        s.len=len+str.len;
        s.stroka=new char[s.len+1];
        strcpy(s.stroka,stroka);
        strcat(s.stroka,str.stroka);
        [COLOR=Red]cout<<s.stroka<<endl;[/COLOR]
        return s;
    }

int main()
{
    rusStr a("qweприветqwe"), b("213мир23"), c=a;
   
    [SIZE=5][COLOR=Red]a=a+b;[/COLOR][/SIZE]
    a.get();

    return 0;
}
Перегрузите для этого класса следующие операторы: +, +=, [].
в качестве входных данных используйте текстовые файлы

и подскажите что значит перегрузить [] что именно они должны делать? проверять на конец строки? или что??



Код:
{    
char* getStr() {return stroka;}

    rusStr operator+(const rusStr& rhs)
    {
        rusStr temp;
        temp.len = len + rhs.len;
        temp.stroka = new char[temp.len + 1];
        strcpy(temp.stroka,stroka);
        strcat(temp.stroka,rhs.stroka);
        return temp;
    }

    rusStr& operator+=(const rusStr& rhs)
    {
        int totalLen = len + rhs.len;
        char* totalStroka = new char[totalLen + 1];
        strcpy(totalStroka,stroka);
        strcat(totalStroka,rhs.stroka);
        delete[] stroka;
        stroka = totalStroka;
        return *this;
    }

    rusStr& operator=(const rusStr& rhs)
    {
        if(this == &rhs) return *this;
        delete [] stroka;
        stroka = new char[rhs.len + 1];
        strcpy(stroka, rhs.stroka);
        len = rhs.len;
        return *this;
    }

    char& operator[](int index)
    {
        if(index>=0 && index < len)
        {
            return stroka[index];
        }
        else
        {
            //кинуть исключение или еще что-нибудь
        }
    }
}
   
char *rus_str(const char *in,char *out)
{
    if (CharToOemA(in, out))
        return out;
    else
        return 0;
}


int main()
{
    rusStr a("qweприветqwe"), b("213мир23"), c;
    char *str = new char[100];
   
    cout << rus_str(a.getStr(),str) << endl;    
    cout << rus_str(b.getStr(),str) << endl;

    c = a  + b;
    cout << rus_str(c.getStr(),str) << endl;    

    c += b;
    cout << rus_str(c.getStr(),str) << endl;    
   
    cout << c[1] << endl;    

    return 0;
}
Смотри что я выделил в твоем коде красным. Ты в выражении a = a+b; используешь не только сумму но и присваивание, поэтому необходимо и перегрузить оператор присваивания.
Индексатор [] возвращает в твоем случае букву на определенной позиции.

Все операторы я перегрузил, смотри код (просто вставь кусками в свой код, надеюсь поймешь что куда вставлять), также немного по другому делал вывод на экран но ты уже сам разберешься что и как.
44K
13 декабря 2008 года
Veli-NA
2 / / 29.11.2008
Эта же задача... слепила из того, что выкладывали, но т.к. я еще только начала изучать язык с/с++ не могу понять в чем ошибки! Помогите пожалуйста кто может.



#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>
#include <windows.h>

using namespace std;

class rusStr
{
char *stroka;
int len;
public:
rusStr(char *s = "")
{
stroka=filter(s);
len=strlen(stroka);
}
rusStr(rusStr &str)
{
len=str.len;
stroka=new char[len+1];
strcpy(stroka,str.stroka);
}

~rusStr() {delete[] stroka;}

void get()
{
cout<<stroka<<endl;
char* x;
x=new char[strlen(stroka)+1];
CharToOem(stroka,x);
cout<<x<<endl;
delete[] x;
}

char* getStr() {return stroka}

rusStr operator+(const rusStr& rhs)
{
rusStr temp;
temp.len = len + rhs.len;
temp.stroka = new char[temp.len + 1];
strcpy(temp.stroka,stroka);
strcat(temp.stroka,rhs.stroka);
return temp;
}

rusStr& operator+=(const rusStr& rhs)
{
int totalLen = len + rhs.len;
char* totalStroka = new char[totalLen + 1];
strcpy(totalStroka,stroka);
strcat(totalStroka,rhs.stroka);
delete[] stroka;
stroka = totalStroka;
return *this;
}

rusStr& operator=(const rusStr& rhs)
{
if(this == &rhs) return *this;
delete [] stroka;
stroka = new char[rhs.len + 1];
strcpy(stroka, rhs.stroka);
len = rhs.len;
return *this;
}


/*
rusStr operator+(const rusStr str)
{
char* s1;
s1=new char[len+str.len+1];
strcpy(s1,stroka);
strcat(s1,str.stroka);
cout<<s1<<endl;
return s1;
}*/



/*
______________________________
*/


char& operator[](int index)
{
if(index>=0 && index < len)
{
return stroka[index];
}
else
{
//кинуть исключение или еще что-нибудь
}
}


char *rus_str (const char *in, char *out)
{
if (CharToOemA(in, out))
return out;
else
return 0;
}

/*
______________________________
*/



char* filter(char* s)
{
char* str;
int len=strlen(s);
int j=0;
int i=0;
while(i<len)
{
if(((s>='а') && (s<='я')) || ((s>='А') && (s<='Я')))
{
j++;
}
if(s=='\n')
len--;
i++;
}
{ str=new char[j+1];
j=0;
i=0;
len=strlen(s);
while(i<len)
{
if(((s>='а') && (s<='я')) || ((s>='А') && (s<='Я')))
{
str[j]=s;
j++;
}
if(s=='\n')
len--;
i++;
}
str[j]=0;
return str;
}



int main()
{
rusStr a("qweприветqwe"), b("213мир23"), c;
char *str = new char[100];

cout << rus_str(a.getStr(),str) << endl;
cout << rus_str(b.getStr(),str) << endl;

c = a + b;
cout << rus_str(c.getStr(),str) << endl;

c += b;
cout << rus_str(c.getStr(),str) << endl;

cout << c[1] << endl;

return 0;
}
}
:o:o:o
46K
23 декабря 2008 года
dexif
1 / / 23.12.2008
Доработанная программа здесь : http://exgraphics.info/forum/viewtopic.php?p=841#841
47K
15 января 2009 года
Karionova
1 / / 15.01.2009
Пожалуйста, если вам не трудно, помогите решить задачу:

Вычислить сумму 1!+2!+3!+…+n! . Значение n вводится с клавиатуры;
Задача по теме: Организация приложений с несколькими потоками.
Класс TThread.
с++ Builder
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог