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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка операторов 
V
    Опции темы
Redstuff
Дата 4.6.2006, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Команда REDSTUFF
**


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

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



Я перелистал кучу книг, просмотрел огромное кол-во сайтов, но никак не могу разобраться с данной темой. Помогите плиз понять смысл всего этого. Нашел примерчики в книгах, но никак не могу заставить их работать ((.

А задание такое:
Над объектом "строка" реализовать следующий набор операций:
+ присоединение строки в конец,
- вырезание подстроки из строки,
^ получение позиции подстроки в строке,
! переворачивание строки,
= присваивание,
>> загрузить строку из файла и ввести с консоли,
<< сохранить строку в файле и вывести на консоль.
Сделать несколько конструкторов объекта.


Код

#include <iostream.h>
#include <conio.h>
#include <String.h>

class String;
istream& operator>>( istream &, const String & );
ostream& operator<<( ostream &, const String & );
class String {
public:

String( const char* = 0 );
String( const String & );

~String();

String& operator=( const String & );
String& operator=( const char * );

char& operator[]( int );

// str1 == str2;
bool operator==( const char * );
bool operator==( const String & );
int size() { return _size; };
char * c_str() { return _string; }
private:
int _size;
char *_string;
};

int main() {
String name1 "Sherlock";
String name2 "Holmes";
name1 += " ";
name1 += name2;
if (! ( name1 == "Sherlock Holmes" ) )
cout << "конкатенация не сработала\n";
}


Добавлено @ 13:19 
Или вот еще один пример:

Код

#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <mbstring.h>
#pragma hdrstop
#pragma argsused
class String {
  private:
  char* s;
  public:
  String& operator+(const String&) const;
};
String& String::operator+(const String& s1) const {
  char* s2 = new char[strlen(s1.s) + strlen(s) + 1];
  strcat(s2, s1, s);   // выдает сообщение об ошибке
  String newStr(s2);
  delete s2;
  return newStr;
}

int main(int argc, char* argv[]) {
  String s1="Hello";
  String s2="Goodbye";
  String s3=s1+s2;
  cout<<s3;
  getch();
}
 


--------------------
ГОСТы, СНиПы, ТУ...
<реклама удалена администрацией форума>
PM MAIL WWW ICQ Skype   Вверх
ZeusAtVingrad
Дата 4.6.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В первом "примерчике" нет оператора += который используется в ф-и main

Вот это
Код

String name1 "Sherlock";
String name2 "Holmes";

вообще не знаю на каком языке написано. Строковые константы должны быть ещё и круглыми скобками обрамлены.

В третьем примерчике компилятор небось ругается, что возвращаешь ссылку на автоматическую переменную в операторе +? 
PM MAIL   Вверх
Redstuff
Дата 4.6.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Команда REDSTUFF
**


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

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



Код

#include <vcl.h>
#include <stdio.h>
#include <iostream.h>   
#include <conio.h>
#include <string.h>
#include <mbstring.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused

class String2 {
  public:
  char* s;        //    Public !!!
  String2  operator+ (const String2 & s1)const;
  String2 ( char *c ) { s = c ;}
  String2  operator = ( String2 & s33 );
  ~String2(){ delete s; }
};

String2  String2::operator+(const String2 &s1)const
{

  char *s22 = new char[strlen(s1.s)+strlen(this->s)+1];
  strcpy(s22,this->s);
  strcat(s22, s1.s);

  String2 *newStr = new String2(s22);// с этот указатель удалить надо где-то 
  //delete s22;
  return *newStr;      
                      
}
String2  String2::operator= ( String2 & s33 )
{
   strcpy(s,s33.s);
   return *this;
}

int main(int argc, char* argv[]) {
  String2 s1="Hello";
  String2 s2="Goodbye";
  //s2=s1;
  String2 s3=s1+s2;
  cout<<s3.s;          
  cin.get();
  return 0;
}

 


--------------------
ГОСТы, СНиПы, ТУ...
<реклама удалена администрацией форума>
PM MAIL WWW ICQ Skype   Вверх
MAKCim
Дата 4.6.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

#include <vcl.h>
#include <stdio.h>
#include <iostream.h>   
#include <conio.h>
#include <string.h>
#include <mbstring.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
class String2 {
  public:
  char* s;        //    Зачем public?
  String2  operator+ (const String2 & s1)const;     // Неверная семантика
  String2 ( char *c ) { s = c ;}       // Кто будет память выделять
  String2  operator = ( String2 & s33 );
  ~String2(){ delete s; }  // Возможно двойное удаление
};
String2  String2::operator+(const String2 &s1)const
{
  char *s22 = new char[strlen(s1.s)+strlen(this->s)+1];
  strcpy(s22,this->s);
  strcat(s22, s1.s);
  String2 *newStr = new String2(s22);// с этот указатель удалить надо где-то 
  //delete s22;
  return *newStr;      
                      
}
String2  String2::operator= ( String2 & s33 )
{
   strcpy(s,s33.s);
   return *this;
}
int main(int argc, char* argv[]) {
  String2 s1="Hello";
  String2 s2="Goodbye";
  //s2=s1;
  String2 s3=s1+s2;
  cout<<s3.s;          
  cin.get();
  return 0;
}
 


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

PM MAIL   Вверх
B3cK
Дата 4.6.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот мой варинат:
Код

#include <iostream.h>
#include <string.h>
#include <iomanip.h>
#include <conio.h>
class myString {
friend istream &operator>> (istream &,myString&);
friend ostream &operator<< (ostream &,const myString&);
char *Ptr;
int length;
public:
myString(char* = "");
myString(const myString &);
const myString &operator+= (const myString );
const myString &operator= (const myString &);
int operator==( const myString&);
int operator!=(const myString &);
int operator<(const myString&)const;
int operator<=(const myString&);
int operator>=(const myString&);
void operator()(int,int);
};
myString::myString(char *s)
{ length=strlen(s);
    Ptr=new char[length+1];
    strcpy(Ptr,s);
}

myString::myString(const myString &copy)
{ length=copy.length;
    Ptr=new char[length+1];
    strcpy(Ptr,copy.Ptr);
}
const myString & myString::operator+=(const myString right)
{
 int newlength;
 newlength=length+right.length;
 char * tempPtr;
 tempPtr=new char[newlength+1];
 strcpy(tempPtr,Ptr);
 strcpy(tempPtr+length,right.Ptr);
 delete [] Ptr;
 Ptr=tempPtr;
 length=newlength;
 return *this;
 }
const myString& myString::operator=(const myString &right)
{ if(&right!=this)
    { delete [] Ptr;
        length=right.length;
        Ptr=new char[length+1];
        strcpy(Ptr,right.Ptr);
    }
    return *this;
}
int myString::operator==(const myString &right)
{
 return strcmp(Ptr,right.Ptr)==0;
}
int myString::operator<(const myString &right) const
{
 return strcmp(Ptr,right.Ptr)<0;
}
int myString::operator!=(const myString &right)
{
 return !(*this==right);
}

int myString::operator<=(const myString &right)
{
 return !(right<*this);
}
int myString::operator>=(const myString &right)
{
return !(*this<right);
}
void myString::operator()(int a, int b)
{ for(;a<b;a++)
        cout<<this->Ptr[a];
 }
istream &operator>> (istream &input, myString &s)
{
 char temp[100];
 input>>setw(100)>>temp;
 s=temp;
 return input;
}

ostream &operator<<(ostream &output, const myString &s)
{
 output << s.Ptr;
 return output;
}
main ()
{ int a=2,b=5;
clrscr();
myString s1("Lovetsky"), s2("Denis");
cout<<s1<<endl<<s2<<endl;
//Peregruzka operatora ==//
cout<<endl<<"Test overload operator =="<<endl;
if(s1==s2)
 cout<<"s1=s2"<<endl;
else cout<<"s1 not s2"<<endl;
//-Peregruzka operatora !=//
cout<<"Test overload operator !="<<endl;
if(s1!=s2)
 cout<<"s1!=s2"<<endl;
else cout<<"s1=s2"<<endl;
//--Peregruzka operatora <//
cout<<"Test overload operator <"<<endl;
if(s1<s2)
 cout<<"s1<s2"<<endl;
else cout<<"s1>=s2"<<endl;
//Peregruzka operatora <=//
cout<<"Test overload operator <="<<endl;
if(s1<=s2)
 cout<<"s1<=s2"<<endl;
else cout<<"s1>s2"<<endl;
//Peregruzka operatora >=//
cout<<"Test overload operator >="<<endl;
if(s1>=s2)
 cout<<"s1>=s2"<<endl;
else cout<<"s1<s2"<<endl;
//Peregruzka operatora +=//
cout<<"Test overload operator +="<<endl;
s1+=s2;
cout<<s1<<endl;
//Peregruzka ()
cout<<"The overload operator ()"<<endl<<"enter a and b"<<endl;
s1(a,b);
cout<<' ';
s2(a,b);
//Peregruzka operatora =//
cout<<endl<<
"Test overload operator ="<<endl;
s1=s2;
cout<<s1<<endl;
getch();
return 0;
}
 
PM MAIL 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.0480 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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