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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
tanyabars
Сообщения: 9
Зарегистрирован: 17 апр 2010, 19:51

Задача. Создать несколько объектов (например а и 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;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

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

str=op.str-str;
Для того, чтобы понять каким образом следует исправить код нам нужно услышать от тебя каким образом по условию задачи должен себя вести оператор -=. Как только мы это выясним, сразу же укажем правильный фикс.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
tanyabars
Сообщения: 9
Зарегистрирован: 17 апр 2010, 19:51

в задаче сказано, что для объектов данного класса реализовать перегрузку операции -= (b-=а)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Очень информативно :)

Ну реализуй операцию пустой. А если не понравится преподавателю, то скажи, что в спецификации сказано реализовать, но как именно реализовать не сказано. Таким образом все условия выполнены и если ему что-то не нравится, то пускай правит функциональную спецификацию :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
tanyabars
Сообщения: 9
Зарегистрирован: 17 апр 2010, 19:51

b-=a, т.е b=b-a от одной строки отнять другую
Аватара пользователя
rrrFer
Сообщения: 237
Зарегистрирован: 07 сен 2008, 14:15
Контактная информация:

b-=a, т.е b=b-a от одной строки отнять другую
пример напишите
Приглашаю на свой блог о программировании: pro-prof.com
tanyabars
Сообщения: 9
Зарегистрирован: 17 апр 2010, 19:51

b= "happy birthday"
a="birthday"
b=b-a т.е happy = happy birthday - birthday
Аватара пользователя
rrrFer
Сообщения: 237
Зарегистрирован: 07 сен 2008, 14:15
Контактная информация:

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

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
Приглашаю на свой блог о программировании: pro-prof.com
tanyabars
Сообщения: 9
Зарегистрирован: 17 апр 2010, 19:51

я исправила код, но выдаёт ошибки

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

#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;
}

}
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Описание перегружаемого оператора должно быть:

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

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