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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка операторов. [VS C++] 
:(
    Опции темы
Macbeth
Дата 31.3.2010, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Вот такой код сейчас. Выбивает ошибку, когда инициализирую объект 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(h->data);
    //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;    
}

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


Опытный
**


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

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



Товарищи у вас на всех одна лаба чтоли? Хоть бы именна переменных поменяли.

Цитата

Вот такой код сейчас. Выбивает ошибку, когда инициализирую объект L3.

Где выбивает догадаться надо?


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
Macbeth
Дата 31.3.2010, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ошибся. Когда иниц. L1. Вот здесь(4 строка в main):
Код

Row L1 = (L3*L3) + L2;


Немного разобрался, здесь должно быть что-то вроде:
Row L1 = (*L3)*(*L3) + L2;

* - между объектами L3 - произведение, остальное указатели(не знаю как по другому описать)
PM MAIL   Вверх
jonie
Дата 1.4.2010, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



L2 у вас тоже указатель, тоже надо разыменовывать....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
xvr
Дата 1.4.2010, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



В коде куча ошибок - в строках 38, 54, 55, 62, 73
Операторы (в строках 18-20) заданны не правильно (они должны принимать const Row& и возвращать Row)
Оператор * вообще задан неправильно - он должен умножать на int, а не на Row

Это сообщение отредактировал(а) xvr - 1.4.2010, 15:10
PM MAIL   Вверх
Macbeth
Дата 1.4.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Можно поподробнее о ошибке в конструкторе копирования и операторе * ?

Заменил указатели ссылками, ошибки в размерах строчных массивов исправил.
Код

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

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


При отладке в цикле где я удваиваю строку выбивает ошибку "Unhandled exception at 0x00412312". Что там не так?

PM MAIL   Вверх
ИванМ
Дата 1.4.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Цитата(Macbeth @  1.4.2010,  16:45 Найти цитируемый пост)
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];
    for(int i = 0; i < strlen(s); i++)
    {
        tmp[i*2+1] = tmp[i*2] = t[i];
    }
    String newStr(tmp);
    delete tmp;
    return newStr;
}

ломал голову так и не понял что этот оператор должен был сделать. присваивание неициализированных (случайных) значений аналогичным.
и в названии параметра s1, а работаете с s

Это сообщение отредактировал(а) ИванМ - 1.4.2010, 16:50
PM MAIL   Вверх
Macbeth
Дата 1.4.2010, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Строку (объект1) нужно удвоить и склеить с объект2 (инициализируется конструктором копирования - присваивается изначальное значение объект1, т.е. "abc" .
Насчет параметра, Вы имеете ввиду сделать так 
Код
 s1.s 
?

Это сообщение отредактировал(а) Macbeth - 1.4.2010, 17:03
PM MAIL   Вверх
ИванМ
Дата 1.4.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Цитата(Macbeth @  1.4.2010,  17:01 Найти цитируемый пост)
Строку (объект1) нужно удвоить и склеить с объект2

это все в одном операторе * или это такая задача вообще?

Цитата(Macbeth @  1.4.2010,  17:01 Найти цитируемый пост)
Насчет параметра, Вы имеете ввиду сделать так 
Выделить всёкод C++
1:
    
 s1.s 

я имею ввиду, что надо писать просто s1, а не s, коли вы пишете так: (const String& s1)


Это сообщение отредактировал(а) ИванМ - 1.4.2010, 17:41
PM MAIL   Вверх
Macbeth
Дата 1.4.2010, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ИванМ @  1.4.2010,  17:41 Найти цитируемый пост)
это все в одном операторе * или это такая задача вообще?

s3 = (s1*s1) + s2. Удвоение надо реализовать перегрузкой оператора * . Склеить перегрузкой оператора + .
Цитата(ИванМ @  1.4.2010,  17:41 Найти цитируемый пост)
я имею ввиду, что надо писать просто s1, а не s, коли вы пишете так: (const String& s1)

Как же мне тогда инициализировать массив, для работы в цикле? (кстати, я забыл его скопировать сюда: t = s1.s) В  s  хранится строка.

PM MAIL   Вверх
ИванМ
Дата 1.4.2010, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Цитата(Macbeth @  1.4.2010,  17:52 Найти цитируемый пост)
s3 = (s1*s1) + s2.

сомневаюсь что так
по идеи должно быть s3 = (s1*2) + s2
s1 это объект String. У него нет метода s. Не понимаю о чем вы говорите
PM MAIL   Вверх
Macbeth
Дата 1.4.2010, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ИванМ @  1.4.2010,  17:57 Найти цитируемый пост)
s1 это объект String. У него нет метода s. Не понимаю о чем вы говорите 

Разве так нельзя обращаться к private части?
PM MAIL   Вверх
ИванМ
Дата 1.4.2010, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Цитата(Macbeth @  1.4.2010,  18:17 Найти цитируемый пост)
Разве так нельзя обращаться к private части? 

к private части можно обращаться только из этого же класса, и в private части класса AnsiString такого члена (s) тоже нет
PM MAIL   Вверх
Macbeth
Дата 1.4.2010, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я наверное чего-то не понимаю. Причем тут AnsiString? И вроде бы я из того же класса обращаюсь к  s.
PM MAIL   Вверх
ИванМ
Дата 1.4.2010, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



прошу прощения
я вас дезинформировал
я думал String это не ваш класс а стандартный
почему то думал что вы работаете внутри Row

Добавлено @ 19:00
вот например, код набросал для утроения строки из 4 символов:
ins - входной массив, outs-выходной

Код

    char ins[5]="1234";
    char outs[13];
    int n=3;
    for(int i=0;i<strlen(ins);i++)
    for(int j=0;j<n;j++)
    {
        outs[i*n+j]=ins[i];
    }
    outs[12]=0;


для удвоения просто заменить n с 3 на 2

Это сообщение отредактировал(а) ИванМ - 1.4.2010, 19:00
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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