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

Поиск:

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


Эксперт
****


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

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



Цитата(Macbeth @ 1.4.2010,  16:45)
Можно поподробнее о ошибке в конструкторе копирования и операторе * ?

Можно. Коментарии в тексте

Код


class String 
{

    String& operator*(const String& s1)const;
    String& operator+(const String& s1)const;
    String& operator=(const String& h);
// Методы должны возвращать String, а не String&

};

String::String(char *v)
{
    s = v;
// Ошибка - строку нужно копировать, так например
   strcpy(s=new char[strlen(v)+1],v);
}

String::String(String &d)
{
    s = d.s;
// Аналогично
   strcpy(s=new char[strlen(d.s)+1],d.s);

}

String::~String()
{
// Ошибка - отсуствует удаление выделенной памяти:
 delete[] s;
}

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];
// t не проинициализирован, нужно s[i]
    }
    String newStr(tmp);

    delete tmp;
    return newStr;
}

String& String::operator=(const String& h)
{
    String res;
    res = h.s;
// 2 ошибки - нет копирования строки, и бесконечная рекурсия (res = h.s; развернется в res.operator=(String(h.s)); )
    return res;
}
Вопрос - зачем оператору '*' второй параметр, если он его игнорирует?

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


Новичок



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

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



Взял код отсюда Добавил только свою перегрузку оператора * . 
Есть ли ошибки? Компилятор ругается уже в процессе компиляции.

Код

#include "stdafx.h"
#include <stdio.h>
#include <iostream>   
#include <conio.h>
#include <string>
#include <mbstring.h>
#pragma hdrstop
using namespace std;
//---------------------------------------------------------------------------
#pragma argsused
class String2 
{
public:
  char* s;       
  String2();
  String2(char *c); 
  String2(const String2 &d);
  ~String2();

  String2 operator+(const String2 & s1)const;
  String2 operator*(const String2 & s1)const;
  String2 operator = ( String2 & s33 );
};

String2::String2( char *c ) 
  {
      int len = strlen(c);
      strcpy(s = new char[len+1],c);
  }

String2::String2(const String2 &d)
  {
      int len = strlen(d.s);
      strcpy(s = new char[len+1],d.s);
  }

String2::~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*(const String2 &s1)const
{
    int len = strlen(s1.s);
    const int n = 2;
    char* tmp = new char[(len*n)+1];
    tmp = NULL;
    //char* t = new char[len+1];
    //t = NULL;
    //t = s1.s;

    for(int i = 0; i < len; i++)
    {
        for(int j = 0; j < n; j++)
        {
            tmp[i*n+j] = s[i];
        }
    }
    String2* newStr = new String2(tmp);

    delete tmp;
    return *newStr;
}

String2  String2::operator= ( String2 & s33 )
{
   strcpy(s,s33.s);
   return *this;
}
int main(int argc, char* argv[]) 
{
  String2 s1="abc";
  String2 s2(s1);
  //s2=s1;
  String2 s3=(s1*s1)+s2;
  cout<<s3.s;        
  //getch();
  cin.get();
  return 0;
}

PM MAIL   Вверх
xvr
Дата 2.4.2010, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Macbeth @ 1.4.2010,  23:40)
Взял код отсюда Добавил только свою перегрузку оператора * . 
Есть ли ошибки? 

Есть
Цитата

Компилятор ругается уже в процессе компиляции.
Где именно?

Ошибки -
Код

class String2 
{
public:
  char* s;       
// Это лучше внести в private часть
  String2();
  String2(char *c); 
  String2(const String2 &d);
  ~String2();

  String2 operator+(const String2 & s1)const;
  String2 operator*(const String2 & s1)const;
  String2 operator = ( String2 & s33 );
};

String2::String2( char *c ) 
// Должно быть String2::String2( const char *c ) (и в теле класса тоже)

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 newStr(s22);// 
  delete s22;
  return newStr;                        
}

String2 String2::operator*(const String2 &s1)const
{
    int len = strlen(s1.s);
    const int n = 2;
    char* tmp = new char[(len*n)+1];
    tmp = NULL;
    //char* t = new char[len+1];
    //t = NULL;
    //t = s1.s;

    for(int i = 0; i < len; i++)
    {
        for(int j = 0; j < n; j++)
        {
            tmp[i*n+j] = s[i];
        }
    }
// Не прописан завершающий нуль в tmp[len*n]=0;

    String2* newStr = new String2(tmp);
    delete tmp;
    return *newStr;
// Аналогично предыдущему месту
}

String2  String2::operator= ( String2 & s33 )
{
   strcpy(s,s33.s);
// Не правильно - не выделенна память под s. Надо удалить память от старой строки и создать новый
   return *this;
}


PM MAIL   Вверх
Macbeth
Дата 2.4.2010, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(xvr @  2.4.2010,  06:50 Найти цитируемый пост)
Где именно?

В цикле, где удваиваю строку.

Цитата(xvr @  2.4.2010,  06:50 Найти цитируемый пост)
Не правильно - не выделенна память под s. Надо удалить память от старой строки и создать новый

Т.е. записать предыдущую строку в какой-нибудь темп, удалить строку, опять распределить память и записать темп?

PM MAIL   Вверх
xvr
Дата 2.4.2010, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Macbeth @ 2.4.2010,  07:53)
Цитата(xvr @  2.4.2010,  06:50 Найти цитируемый пост)
Где именно?

В цикле, где удваиваю строку.

Конкретный номер строки (по листигу из предыдущего поста) и текст ошибки от компилятора - телепаты в отпуске  smile 

Цитата

Т.е. записать предыдущую строку в какой-нибудь темп, удалить строку

- Можно выбросить старую переписку 5 годовой давности?
- Можно, но перед тем, как выбростиь, обязательно разложите ее по адресатам и датам.
 smile 

Код

String2&  String2::operator= ( String2 & s33 )
{
  delete[] s; 
  strcpy(s=new char[strlen(s33.s)+1],s33.s);
  return *this;
}

PM MAIL   Вверх
Macbeth
Дата 2.4.2010, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(xvr @  2.4.2010,  10:26 Найти цитируемый пост)
Конкретный номер строки (по листигу из предыдущего поста) и текст ошибки от компилятора

#48 - "Unhandled exception at 0x00412312"

upd. хм, отредактировал код, теперь в strlen.asm: "Unhandled exception at 0x1026f8e0 (msvcr90d.dll) in VALERON.exe: 0xC0000005: Access violation reading location 0xcccccccc" в строке: 
main_loop:
        mov     eax,dword ptr [ecx] // здесь
PM MAIL   Вверх
xvr
Дата 2.4.2010, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот эта конструкция вообще 'шедевр'
Код

    char* tmp = new char[(len*n)+1];
    tmp = NULL;

Цитата

#48 - "Unhandled exception at 0x00412312"
Это не ошибка при компиляции, а ошибка при выполнении.
Цитата

upd. хм, отредактировал код, теперь в strlen.asm: "Unhandled exception at 0x1026f8e0 (msvcr90d.dll) in VALERON.exe: 0xC0000005: Access violation reading location 0xcccccccc" в строке: 
main_loop:
        mov     eax,dword ptr [ecx] // здесь 
Попытка вызвать strlen от неинициализированного указателя. Посмотрите в стеке откуда звалась strlen

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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