Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2010, 20:28   #1
Macb3th
 
Регистрация: 29.03.2010
Сообщений: 9
По умолчанию Перегрузка операторов.

Задание:
Описать класс, 3 объекта, используя разные конструкторы; объект №3 увеличить в раза(operator*), удвоением каждого символа("abc" ---> "aabbcc"); сложить(operator+) объекты № 3 и №2, затем присвоить(operator=) это объекту №1.

Со сложением вроде бы сделал - через strcat. Помогите, пожалуйста, с операторами умножения и присваивания. Не знаю как реализовать со строками.

Код:
#include "stdafx.h"
#include "row.h"
#include <iostream>
#include <string>

void main()
{
	Row* obj3 = new Row("brrrrr");
	Row* obj1 = (obj3 * obj3) + obj2;
	//Row.Output();
}
//*****************************//
#include "stdafx.h"
#include <string>
#pragma once
using namespace std;

class Row
{
	private:
		char *data;
		int res;
		
	public:
		Row();
		Row(char* v);
		Row(const Row &);
		
		Row* operator*(const Row& c);
		Row* operator+(const Row& c);
		Row* operator=(const Row& c);

		//int Dimension(int _res);
		void Output();
};
//*********************************//
#include "stdafx.h"
#include "row.h"
#include <iostream>
#include <string>
using namespace std;
const int n = 10;

Row::Row()
{
	data = "";
}

Row::Row(char* v)
{
	data = V;
}

Row::Row(const Row &copy)
{
	data = copy.data;
}

/*int Row::Dimension(int _res)
{
	_res = strlen(data);
	return res;
}*/

void Row::Output(){}

Row* Row::operator*(const Row &c)
{	
	// ?
}

Row* Row::operator+(const Row &c)
{
	return(strcat(data,c));
}

Row* Row::operator=(const Row &c)
{
	// ?
}
Macb3th вне форума Ответить с цитированием
Старый 30.03.2010, 22:56   #2
Macb3th
 
Регистрация: 29.03.2010
Сообщений: 9
По умолчанию

Кое-что понял... надо 2 объекта для того чтобы перегрузить оператор. Есть такой вопрос: как реализовать циклом удвоение символов в строке? Помню что видел такое на учебе, а вот саму реализацию не помню. :[
Macb3th вне форума Ответить с цитированием
Старый 30.03.2010, 23:06   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Создаем новый массив вдвое большего размера и потом в цикле
Код:
b [i * 2 + 1] = b[i * 2] = a[i];
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 31.03.2010, 01:27   #4
Macb3th
 
Регистрация: 29.03.2010
Сообщений: 9
По умолчанию

Что-то вроде этого?

Код:
Row Row::operator*(const Row &c)
{	
	char *tmp;
	tmp = data;
	char t[50];

	for(int i = 0; i < 7; i++)
	{
		t[i*2+1] = t[i*2] = tmp[i];
	}
	
	for(int i = 0; i < 15; i++)
	{
		data[i] = tmp[i];
	}
	return data;
}
Macb3th вне форума Ответить с цитированием
Старый 31.03.2010, 15:50   #5
Macb3th
 
Регистрация: 29.03.2010
Сообщений: 9
По умолчанию

Вот такой код сейчас. Выбивает ошибку, когда инициализирую объект L3.
"illegal, left operand has type Row * "
"illegal, right operand has type Row* "
Помогите исправить.

Код:
#include "stdafx.h"
#include "row.h"
#include <iostream>
#include <string>
using namespace std;
const int n = 2;

class Row
{
	private:
		char *data;
		
	public:
		Row();
		Row(char* v);
		Row(Row &);
		
		Row* operator*(Row *c);
		Row* operator+(Row *c);
		Row* operator=(Row *h);

		int Dimension();
		void Out();
};
/**************************/
Row::Row()
{
	data = NULL;
}

Row::Row(char* v)
{
	data = v;
}

Row::Row(Row &copy)
{
	data = copy.data;
}

int Row::Dimension()
{
	int res0 = strlen(data);
	return res0;
}

void Row::Out()
{
	cout << "stroka: " << data << endl;
}

Row* Row::operator*(Row *c)
{	
	char *tmp = new char[strlen(data)];
	tmp = data;
	
	int len = strlen(data);
	for(int i = 0; i < len; i++)
	{
		for(int j = 0; j < n; j++)
		{
			tmp[i*n*j] = data[j];
		}
	}
	
	Row *res = new Row(tmp);
	return res;
}

Row* Row::operator+(Row *c)
{
	int len = strlen(data);
	char *tmp = new char[len+1];
	strcpy(tmp,data);
	strcat(tmp,c->data);

	Row *res1 = new Row(tmp);
	return res1;
}

Row* Row::operator=(Row *h)
{
	Row* res3 = new Row();
	res3 = h;
	return res3;
}

#include "stdafx.h"
#include "row.h"
#include <iostream>
#include <string>
/**********************/
void main()
{
	Row* L3 = new Row("abc");
	Row* L2(L3);

	Row L1 = (L3*L3) + L2;

	L3->Out();
	cout << "Dlinna L3: " << L2->Dimension() << endl;

	L1.Out();
	cout << "Dlinna L1: " << L1.Dimension() << endl;	
}
Macb3th вне форума Ответить с цитированием
Старый 01.04.2010, 21:14   #6
Macb3th
 
Регистрация: 29.03.2010
Сообщений: 9
По умолчанию

Переделал с ссылками... но теперь в цикле где удваиваю строку, выбивает ошибку "Unhandled win32 exception" т.е. уже в процессе компиляции. Присваиваю вроде бы в границах массива. Может кто-то сталкивался с таким?
Код:
#include "stdafx.h"
#include <string>
#include "string.h"
#include <iostream>
using namespace std;


class String 
{
private:
    char* s;
public:
    String();
    String(char* v);
    String(String &d);
    ~String();
    int StrLength();
    void StrShow();
    String& operator*(const String& s1)const;
    String& operator+(const String& s1)const;
    String& operator=(const String& h);
};
/***********************************/
String::String()
{
    s = NULL;
}
String::String(char *v)
{
    s = v;
}
String::String(String &d)
{
    s = d.s;
}
String::~String(){}
int String::StrLength()
{
    int res = strlen(s);
    return res;
}
void String::StrShow()
{
    std::cout << "stroka: " << s << endl;
}
String& String::operator *(const String& s1)const
{
    int len = strlen(s);
    char* tmp = new char[(strlen(s)*2)+1];
    char* t = new char[strlen(s)+1];
    t = NULL;
    t = s1.s;

    for(int i = 0; i < strlen(s); i++)
    {
        tmp[i*2+1] = tmp[i*2] = t[i];
    }
    String newStr(tmp);
    delete tmp;
    return newStr;
}
String& String::operator+(const String& s1)const
{
    int len = strlen(s);
    char* tmp = new char[strlen(s1.s) + strlen(s) + 1];  
    strcpy(tmp, s);
    strcat(tmp, s1.s);
    String newStr(tmp);
    delete tmp;
    return newStr;
}
String& String::operator=(const String& h)
{
    String res;
    res = h.s;
    return res;
}
/*************************************/
int _tmain(int argc, _TCHAR* argv[])
{
    String s1 = "abc";
    String s2(s1);
    String s3 = (s1*s1) + s2;
    s1.StrShow();
    cout << "length s1: " << s1.StrLength() << endl;
    //s3.StrShow();
    //cout << "length s3: " << s3.StrLength() << endl;
    return 0;
}
Macb3th вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы ны С++, перегрузка функций,операторов Shturmovik Помощь студентам 1 04.06.2009 22:58
Задача на классы, перегрузка операторов [C++] Roomper Помощь студентам 13 30.05.2009 08:36
Перегрузка операторов <<, >>, +=, +. class data Наташенька Общие вопросы C/C++ 2 02.05.2009 10:04
Перегрузка операторов (С++) Перчитель Помощь студентам 1 03.12.2008 18:46
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15