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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]Перегрузка операторов 
V
    Опции темы
Энжи
Дата 12.12.2009, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Реализовать класс String для работы со строками символов. Память под строку выделять динамически. Перегрузить операторы ==,>,<,!= и операции ввода-вывода в поток.В функции main привести примеры реализации указанных операций.
PM MAIL   Вверх
Энжи
Дата 13.12.2009, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вот что получилось,но все равно не работает....

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


class string
{
public:
 string(char *);
 string ();
 string (string *);
 int operator ==(string str);
 int operator >(string str);
 int operator <(string str);
 int operator !=(string str);
// ostream &operator << (ostream &stream);
 char *stroka;
};

int string :: operator==(string str)
{
int i;
for (i=0;stroka[i]==str.stroka[i];i++)
    if (stroka[i]==NULL && str.stroka[i]==NULL) return (1);//ravni
return (0);
};

int string :: operator!=(string str)
{
int i;
for (i=0;stroka[i]==str.stroka[i];i++)
    if ((stroka[i])==NULL&&(str.stroka[i]!=NULL)
    ||(stroka[i]!=NULL&&str.stroka[i]==NULL))
     {
     cout<<"234";
     return (1);//neravni
     };
return (0);
};

int string:: operator > (string str)
{
int i;
for (i=0;stroka[i]==str.stroka[i];i++)
    if (stroka[i]==NULL&&str.stroka[i]==NULL) return (0);//ravni;
 if (stroka[i]>str.stroka[i]) return (1);//bolshe
return (-1);//menshe
};


int string:: operator < (string str)
{
int i;
for (i=0;stroka[i]==str.stroka[i];i++)
    if (stroka[i]==NULL&&str.stroka[i]==NULL) return (0);//ravni;
 if (stroka[i]<str.stroka[i]) return (1);//menshe
return (-1);//bolshe
};

void main()
{
clrscr();
int i;
string *p[2];
p[1]->stroka[256]=(char)malloc(256);
strcpy(p[1]->stroka,"tdlkfjlsk;djflksjdfl;ksdjglkdjfgkl;jdfl;gjdf");
p[2]->stroka[256]=(char)malloc(256);
strcpy(p[2]->stroka,"sdlkfjlsk;djflksjdfl;ksdjglkdjfgkl;jdfl;gjdf");
p[1] != p[2];
getch();
};

ostream &operator << (ostream &stream,string str)
{
int i,j;
j=0;
while (str.stroka[j]!=NULL)
 {
  if (j%10==0)
  {
      stream <<"-"<<endl;
  }
  stream <<str.stroka[j];
  j++;
};
return stream;
};

ostream &operator >> (ostream &stream,string str)
{
char c;
int i;
i=0;
 while (cin>>c)
 {
   str.stroka[i]>>c;
   stream>>str.stroka;
   i++;
 }
return stream;
/*char s[256];
stream.getline(s,256);
strcpy(str.stroka,s);
return stream; */
};

string :: string (char *str)
{
 strcpy (stroka,str);
};
string :: string ()
{};
string::string (string *)
{};


PM MAIL   Вверх
t_gran
Дата 14.12.2009, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Признаюсь, такого винегрета я уже давно не видел. smile

Цитата

вот что получилось,но все равно не работает....


И не будет работать. Такой пример с безграмотным использование указателей я давно уже не видел.

Вот как должна выглядеть ф-ия main исходя из правильности, а не ваших соображений.
Код

int main()
{
    int i;
    TString p[2]; // А не TString *p[2]
    // Если вы пишите на C++ тогда 'new', а не malloc.
    // p[1]->stroka[256]=(char)malloc(256); - это вообще как?! :-)
    // И меняем селектор '->' на '.', т.к. заменили на статический массив. 
    p[1].stroka= new char[256];
    strcpy(p[1].stroka,"tdlkfjlsk;djflksjdfl;ksdjglkdjfgkl;jdfl;gjdf");
    p[2].stroka= new char[256];
    strcpy(p[2].stroka,"sdlkfjlsk;djflksjdfl;ksdjglkdjfgkl;jdfl;gjdf");
    p[1] != p[2]; // И что?
    cout << p[1] << " " << p[2] << endl;
    return 0;
};


В этом случае ваш код будет верен и выведет:
Код

-
tdlkfjlsk;-
djflksjdfl-
;ksdjglkdj-
fgkl;jdfl;-
gjdf -
sdlkfjlsk;-
djflksjdfl-
;ksdjglkdj-
fgkl;jdfl;-
gjdf


P.S.: Извините за мою грубость, но в таких вопросах могу только так.



--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Энжи
Дата 14.12.2009, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



t_gran, спасибо большое за ответ и простите мне мою безграммотность - я в указателях как свинка в апельсинах smile 

исправила по Вашему совету и выдает ошибки на строчках 

Код

  p[1].stroka= new char[256];
....
  p[2].stroka= new char[256];
.......

========
cannot convert ' char * ' to ' char '




а по поводу 
Код

 p[1] != p[2]; // И что?


должно было выводить строчку 234 (проверяла работает ли перегрузка) и видимо тоже где-то накосячила :(
PM MAIL   Вверх
t_gran
Дата 15.12.2009, 03:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Цитата

cannot convert ' char * ' to ' char '

 smile 
Как так? Вы ничего не напутали? Хотя если вы пользуетесь DOS-овским TC, то я не удивлён.
Данный код компилил компиляторами: gcc, cl (MSVS-2005), bcc32 (CBuilder 6). Нигде ошибок не возникало, да и не могло быть. smile
Код

#include <iostream>
#include <string.h>

using namespace std;

class TString
{
   public:
       TString() {};
       TString(TString *) {};
       TString(char *);
       int operator == (TString str);
       int operator > (TString str);
       int operator < (TString str);
       int operator != (TString str);
   // ostream &operator << (ostream &stream);
       char *stroka;
};

TString :: TString (char *str)
{
   stroka= new char[strlen(str)];
   strcpy(stroka, str);
};

int TString :: operator==(TString str)
{
    int i;
    for (i=0;stroka[i]==str.stroka[i];i++)
        if (stroka[i]==0 && str.stroka[i]==0) return (1);//ravni
    return (0);
};

int TString :: operator!=(TString str)
{
    int i;
    for (i=0;stroka[i]==str.stroka[i];i++)
        if ((stroka[i])==0&&(str.stroka[i]!=0)
                ||(stroka[i]!=0&&str.stroka[i]==0))
        {
            cout<<"234";
            return (1);//neravni
        };
    return (0);
};

int TString:: operator > (TString str)
{
    int i;
    for (i=0;stroka[i]==str.stroka[i];i++)
        if (stroka[i]==0&&str.stroka[i]==0) return (0);//ravni;
    if (stroka[i]>str.stroka[i]) return (1);//bolshe
    return (-1);//menshe
};

int TString:: operator < (TString str)
{
    int i;
    for (i=0;stroka[i]==str.stroka[i];i++)
        if (stroka[i]==0&&str.stroka[i]==0) return (0);//ravni;
    if (stroka[i]<str.stroka[i]) return (1);//menshe
    return (-1);//bolshe
};

ostream &operator << (ostream &stream,TString str)
{
    int i,j;
    j=0;
    while (str.stroka[j]!=0)
    {
        if (j%10==0)
        {
            stream <<"-"<<endl;
        }
        stream <<str.stroka[j];
        j++;
    };
    return stream;
};

ostream &operator >> (ostream &stream,TString str)
{
    char c;
    int i;
    i=0;
    while (cin>>c)
    {
        str.stroka[i]>>c;
        stream>>str.stroka;
        i++;
    }
    return stream;
    /*char s[256];
    stream.getline(s,256);
    strcpy(str.stroka,s);
    return stream; */
};

int main()
{
    int i;
    TString p[2];
    p[1].stroka= new char[256];
    strcpy(p[1].stroka,"tdlkfjlsk;djflksjdfl;ksdjglkdjfgkl;jdfl;gjdf");
    p[2].stroka= new char[256];
    strcpy(p[2].stroka,"sdlkfjlsk;djflksjdfl;ksdjglkdjfgkl;jdfl;gjdf");
    p[1] != p[2];
    cout << p[1] << " " << p[2] << endl;
    return 0;
};

P.S.: Код ваш. Кроме main ничего не менял.

Это сообщение отредактировал(а) t_gran - 15.12.2009, 03:49


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Энжи
Дата 15.12.2009, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, я использую досовский...попробую билдером..
простите еще раз мою неграммотность, но правильно ли я вызываю перегруженный оператор или это необходимо делать по-другому??

Код
 
  p[1] != p[2]

PM MAIL   Вверх
t_gran
Дата 15.12.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Да нет, с точки зрения компилятора - всё верно. Только результата видно не будет. Если нужен результат, то логично выполнить проверку.
Код

if (p[1] != p[2])
{
   // ...
}
else
{
   // ...
}


К слову: не люблю и не хочу агетировать, и прекрасно понимаю, что во многих университетах используют для обучения старые DOS-овские компиляторы, но всё же советую перейти на более современный компилятор который учитывает последние стандарты C++. Тогда у вас проблем поубавится с изучением языка по книгам и подобных ошибок, как в данном случае, не будет. В моём университете стояли tc-3.0, gcc-3.4.2 и bcc32 (CBuilder 6), а на некоторых и cl (MSVC), поэтому у меня никогда проблем не возникало. smile
И немного рекламы smile: сам пользуюсь и всем своим студентам советую Code::Blocks.

Это сообщение отредактировал(а) t_gran - 15.12.2009, 11:37


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Энжи
Дата 15.12.2009, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



t_gran, спасибо за Ваши ответыsmile 
у нас в универе есть все указанные Вами компиляторы...кроме может линуксногоsmile...но я как-то привыкла к досовскому, теперь сложно пересесть...но я буду старатьсяsmile 
по поводу программы : перекомпилила в билдере - все работает как Вы и говорили..изменила вызов перегрузки..в результате main() выглядит вот так:
Код

int main()
{
    int i;
    TString p[2];
    p[1].stroka= new char[256];
    strcpy(p[1].stroka,"tdlkfjlsk;djflksjdfl;ksdjglkdjfgkl;jdfl;gjdf");
    p[2].stroka= new char[256];
    strcpy(p[2].stroka,"sdlkfjlsk;djflksjdfl;ksdjglkdjfgkl;jdfl;gjdf");
    cout << p[1] << "\n" << p[2] << endl;
    if (p[1] != p[2])
    {
      if (p[1]>p[2])
       cout<<"Stroka"<< p[1]<< "> stroki"<<p[2]<<"\n";
      if (p[1]<p[2])
       cout<<"Stroka"<< p[1]<< "< stroki"<<p[2]<<"\n";
    }
    else
    if (p[1] == p[2])
     cout<<"Stroka"<< p[1]<< "ravna stroke"<<p[2]<<"\n";
    cout<<"vvedite stroku: ";
    cin >> p[1].stroka;
    cout <<'\n'<< p[1];
    getch();
    return 0;
};


перегрузку << тоже изменила :
Код
 ostream &operator << (ostream &stream,TString str)
{
    int i,j;
    j=0;
    stream << "Novaia stroka:"<<str.stroka;
    return stream;
};


Остальное без изменений....В результате компилятор вообще пропускает сравнение...как первое != так и ==..может ошибка в коде функции перегрузки??
И еще такой вопросик - когда ставлю  

Код

cin >> p[1] ;// а не cin >> p[1].stroka
 


компилятор ругается 
Код
[C++ Error] 1.cpp(112): E2094 'operator>>' not implemented in type 'istream' for arguments of type 'TString'


чувствую себя неудачницей smile 
может он хочет чтобы я перегрузку в класс внесла?
PM MAIL   Вверх
t_gran
Дата 16.12.2009, 03:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Цитата

cin >> p[1] ;// а не cin >> p[1].stroka

компилятор ругается 


Правильно, и будет ругаться. Дело в том, что вы перенаправление '>>' не верно переопределили. Тут нужно использовать поток istream, а не ostream:
Код

istream &operator >> (istream &stream,TString str) // istream, а не ostream
{
    char c;
    int i;
    i=0;
    while (cin>>c)
    {
        str.stroka[i]>>c;
        stream>>str.stroka;
        i++;
    }
    return stream;
};


Перегрузка '==' отлично работает, а что касается '!=' то ваш алгоритм действительно не корректно работает, всегда возвращает false (т.е. 0). Предлагаю, т.к. '==' у вас работает верно, то на базе него выполнить и '!=':
Код

int TString :: operator!=(TString str)
{
    return !(*this == str); // Проще же?
};


И совет, для теста каждого переопределённого метода используйте следующий код:
Код

   if (p[1] != p[2])
      cout << "p[1] != p[2]" << endl;
   if (p[1] > p[2])
      cout << "p[1] > p[2]" << endl;
   if (p[1] < p[2])
      cout << "p[1] < p[2]" << endl;
   if (p[1] == p[2])
      cout << "p[1] == p[2]" << endl;

Так, вы легко изменяя параметры p[1] и p[2] сможете проверить правильность выполнения каждого из методов отдельно.

Это сообщение отредактировал(а) t_gran - 16.12.2009, 03:57


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Энжи
Дата 17.12.2009, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



t_gran, огромное Вам спасибоsmile чтобы у всех были такие преподавателиsmile
Задачка решена, в итоге код выглядит :

Код
#include <iostream>
#include <conio.h>
#include <string.h>

using namespace std;

class TString
{
   public:
       TString() {};
       TString(TString *) {};
       TString(char *);
       int operator == (TString str);
       int operator > (TString str);
       int operator < (TString str);
       int operator != (TString str);
   // ostream &operator << (ostream &stream);
       char *stroka;
};

TString :: TString (char *str)
{
   stroka= new char[strlen(str)];
   strcpy(stroka, str);
};

int TString :: operator==(TString str)
{
    int i;
    for (i=0;stroka[i]==str.stroka[i];i++)
        if (stroka[i]==0 && str.stroka[i]==0) return (1);//ravni
    return (0);
};

int TString :: operator!=(TString str)
{
   return !(* this  == str) ;
};

int TString:: operator > (TString str)
{
    int i;
    for (i=0;stroka[i]==str.stroka[i];i++)
     if (stroka[i]>=str.stroka[i]) return (1) ;
     else//bolshe
    return (0);//menshe
};

int TString:: operator < (TString str)
{
    int i;
    for (i=0;stroka[i]==str.stroka[i];i++)
        if (stroka[i]==0&&str.stroka[i]==0) return (0);//ravni;
    if (stroka[i]<=str.stroka[i]) return (1);//menshe
    return (-1);//bolshe
};


ostream &operator << (ostream &stream,TString str)
{
    stream << "Stroka:"<<str.stroka;
    return stream;
};

istream &operator >> (istream &stream,TString str)
{
 char s[256];
 stream.getline(s,256);
 str=s;
 return stream;
};

int main()
{
    int i;
    TString p[2];
    p[1].stroka= new char[256];
    strcpy(p[1].stroka,"tdlkfjlsk;djflksjdfl;ksdjglkdjfgkl;jdfl;gjdf");
    p[2].stroka= new char[256];
    strcpy(p[2].stroka,"sdlkfjlsk;djflksjdfl;ksdjglkdjfgkl;jdfl;gjdf");
    cout << p[1] << "\n" << p[2] << endl;
    if (p[1] != p[2])
       cout<< p[1]<< "!="<<p[2]<<"\n";
    if (p[1]<p[2])
       cout<<p[1]<<"< "<<p[2]<<"\n";
    if (p[1]>p[2])
       cout<<p[1]<<"> "<<p[2]<<"\n";
    if (p[1] == p[2])
    cout<< p[1]<< "=="<<p[2]<<"\n";
    cout<<"vvedite stroku: ";
    cin >> p[1];
    cout <<"Novia "<<'\n'<< p[1];
    getch();
    return 0;
};


Еще раз гигантское спасибо t_gran!Поставила бы + но нету 100 сообщений..несправедливо...

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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