Страница 1 из 1

перегрузка оператора С++

Добавлено: 17 апр 2010, 20:05
tanyabars
Задача. Создать несколько объектов (например а и b ) разработанного класса. Класс - символьная строка. Реализовать для объектов данного класса перегрузку операции -=(b-=а). Содержимое объектов (а, b, их строк) до и после выполнения операции, вывести на экран.
Проверьте пожалуйста код программы и помогите исправить ошибки.

Код: Выделить всё

#include <iostream>
#include <cstdio>
#include "string.h"
using namespace std;

class String
{
private:
	char str[100];  
public:
	String(); 
	String(char *s);
	String(const String &);
	~String(); 
	 String operator-=(String op);
	void input();
	void see();
};

String::String()  
{
	strcpy(str,"");
}

String::String(char *s)  
{
	strcpy(str,s);
}

String::String(const String &a)  
{
	 
	strcpy(str,a.str);  
}

String::~String()
{
	//if(str) delete [] str;
}

String String:: operator-=(String op)
{
	str=op.str-str;
	return *this;
}


void String::see()
{
	cout<<"new string: "<<str<<endl;
}

void String::input()
{
	cout << "Enter String: ";
    gets(str);	
}

int main()
{
	String a,b;	
	a.input();
	b.input();
	b-=a;
	b.see();

	return 0;
}

Re: перегрузка оператора С++

Добавлено: 17 апр 2010, 22:22
Romeo
Применение оператора "-" к поинтерам даст арифметическую разность адресов, что не будет в свою очередь валидным адресом. Таким образом, ошибочное место вот оно:

Код: Выделить всё

str=op.str-str;
Для того, чтобы понять каким образом следует исправить код нам нужно услышать от тебя каким образом по условию задачи должен себя вести оператор -=. Как только мы это выясним, сразу же укажем правильный фикс.

Re: перегрузка оператора С++

Добавлено: 17 апр 2010, 22:29
tanyabars
в задаче сказано, что для объектов данного класса реализовать перегрузку операции -= (b-=а)

Re: перегрузка оператора С++

Добавлено: 17 апр 2010, 22:45
Romeo
Очень информативно :)

Ну реализуй операцию пустой. А если не понравится преподавателю, то скажи, что в спецификации сказано реализовать, но как именно реализовать не сказано. Таким образом все условия выполнены и если ему что-то не нравится, то пускай правит функциональную спецификацию :)

Re: перегрузка оператора С++

Добавлено: 20 апр 2010, 00:01
tanyabars
b-=a, т.е b=b-a от одной строки отнять другую

Re: перегрузка оператора С++

Добавлено: 20 апр 2010, 13:13
rrrFer
b-=a, т.е b=b-a от одной строки отнять другую
пример напишите

Re: перегрузка оператора С++

Добавлено: 20 апр 2010, 13:35
tanyabars
b= "happy birthday"
a="birthday"
b=b-a т.е happy = happy birthday - birthday

Re: перегрузка оператора С++

Добавлено: 20 апр 2010, 19:23
rrrFer

Код: Выделить всё

String String:: operator-=(String op){
	int i;
	for(i=0;*(this->str)==op.str[i]&&*(this->str)&&op.str[i];i++){
		this->str++;
	}
    return *this;
}
как то так наверно, и ИМХО лучше передавать в функцию указатель или ссылку на обьект.
и еще this->str++; возможно если str будет указателем,т.е. надо обьявить char *str; и в конструкторе выделять память, в деструкторе нужно выполнить delete

Re: перегрузка оператора С++

Добавлено: 20 апр 2010, 19:57
tanyabars
я исправила код, но выдаёт ошибки

Код: Выделить всё

#include <iostream>
#include <cstdio>
#include "string.h"
using namespace std;

class String
{
private:
    char *str;  
public:
    String();
    String(char *s);
    String(const String &);
    ~String();
     String operator-=(String op);
    void input();
    void see();
};

String::String()  
{
    strcpy(str,"");
}

String::String(char *s)  
{
    strcpy(str,s);
}

String::String(const String &a)  
{
     
    strcpy(str,a.str);  
}

String::~String()
{
    if(str) delete [] str;
}
String String:: operator-=(String op){
    int i;
    for(i=0;*(this->str)==op.str[i]&&*(this->str)&&op.str[i];i++){
        this->str++;
    }
    return *this;

void String::see()
{
    cout<<"new string: "<<str<<endl;
}

void String::input()
{
    cout << "Enter String: ";
    gets(str); 
}

int main()
{
    String a,b;
    a.input();
    b.input();
    b-=a;
    b.see();

    return 0;
}

}

Re: перегрузка оператора С++

Добавлено: 22 апр 2010, 13:00
BBB
Описание перегружаемого оператора должно быть:

Код: Выделить всё

String& operator-=(const String& op);
Т.е., в частности, тип результата - не объект, а ссылка на объект