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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перегрузка 
:(
    Опции темы
Ice08
Дата 20.6.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#include <stdio.h>
#include <iostream>
#include <string.h>


class string {
public:
        string(const char * = " ");
                        string operator+(const string &);
                       ~string();
private:
        char *ptr;
        int lenght;


};

string :: string(const char *s){

lenght = strlen(s);
ptr = new char[lenght+1];

for(int i=0;i<=lenght;i++)
ptr[i] = s[i];

ptr[lenght + 1] = '\0';
}

string :: ~string(){ delete [] ptr; }

string string :: operator+(const string &obj2)
{

string temp;

strcpy(temp.ptr,ptr);
strcat(temp.ptr, obj2.ptr);

return temp;

}


int main()
 {

  string ob1("Hello"), ob2("World"), ob3();

  ob3 = ob1 + ob2;

getchar();
return 0;
}



почему ошибка?

Выполняется сперва ob1 + ob2 вызывается перегруженая операция + строки сцепляются возвращается обьект типа стринг и побитово скопируется в ob3.  Ну почему ошибка или я чегото не допонял?




PM WWW   Вверх
Daevaorn
Дата 20.6.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



У вас нет побитового копирования.
У вас ошибка в логике копирования строк в операторе +.
PM MAIL WWW   Вверх
anatox91
Дата 20.6.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

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



и еще: ты в курсе куда ты вставляешь терминирующий ноль?
Код

ptr[lenght + 1] = '\0'; //не забывай, что отсчет в С++ начинается с нуля, поэтому ты вставляешь ноль на позицию, после нужной тебе

надо так:
Код

ptr[lenght] = '\0';


и еще убери скобки здесь:
Код

string ob1("Hello"), ob2("World"), ob3();


Это сообщение отредактировал(а) anatox91 - 20.6.2008, 13:29


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
Ice08
Дата 20.6.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

У вас ошибка в логике копирования строк в операторе +.

нет строки слаживает правильно. Только как этот темп вернуть назад и присвоить значение обькта темп обьекту об3? 

Цитата

и еще: ты в курсе куда ты вставляешь терминирующий ноль?

точно

Это сообщение отредактировал(а) Ice08 - 20.6.2008, 17:17
PM WWW   Вверх
Daevaorn
Дата 20.6.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(Ice08 @  20.6.2008,  14:37 Найти цитируемый пост)
нет строки слажывет правильно

это вам так кажется. Подумайте какой размер буфера у temp и какую строку вы туда засовываете.

Ах, да, какая ошибка то вообще?
PM MAIL WWW   Вверх
anatox91
Дата 20.6.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

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



Цитата(Daevaorn @  20.6.2008,  13:42 Найти цитируемый пост)
Ах, да, какая ошибка то вообще?

вот именно, Ice08, хоть бы привел дословно ошибки компилятора, а то мы тут скоро телепатами станем



--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
Ice08
Дата 20.6.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#include <stdio.h>
#include <iostream>
#include <string.h>


class string {
public:
        string(const char * = " ");
      string  operator+(const string &);
      void  operator=(const string &);
      void get(){cout << ptr;}
      ~string();
private:
        char *ptr;
        int lenght;


};

string :: string(const char *s){

lenght = strlen(s);
ptr = new char[lenght+1];

for(int i=0;i<=lenght;i++)
ptr[i] = s[i];

ptr[lenght] = '\0';
}

string :: ~string(){ delete [] ptr; }

string  string :: operator+(const string &obj2)
{

static string temp;

temp.ptr = new char [20];

strcpy(temp.ptr,ptr);
strcat(temp.ptr, obj2.ptr);

return temp;

}

void string :: operator=(const string &temp)
{

ptr = new char [strlen(temp.ptr)+1];

strcpy(ptr,temp.ptr);


}

int main()
 {

  string ob1("Hello"), ob2("World"), ob3;

  ob3 = ob1 + ob2;

  ob3.get();

getchar();
return 0;
}

чуть доделал заработало.

Ну есть вопросы: 
1)Почему компилятор побитово не скопировал?
2)В книге  есть пример ob3 = ob1 перегрузки присваивания обьетов, но как компилятор унает нужно вызвать перегруженую операцию или побитово скопировать?
PM WWW   Вверх
IKM2007
Дата 20.6.2008, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


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

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



Цитата(Ice08 @  20.6.2008,  14:10 Найти цитируемый пост)
как компилятор унает нужно вызвать перегруженую операцию или побитово скопировать?

Если у тебя есть класс string.
Тогда
Код

string ob1("Hello"), ob2("World"), ob3;
ob3=ob1;//Перегруженная операция присваивания
string ob4=ob1;//конструктор копии




--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
Daevaorn
Дата 20.6.2008, 20:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



А в какой книге про "побитовое копирование" написано? Автору руки вправить надоsmile

Это сообщение отредактировал(а) Daevaorn - 20.6.2008, 22:40
PM MAIL WWW   Вверх
IKM2007
Дата 20.6.2008, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


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

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



Цитата(Daevaorn @  20.6.2008,  20:22 Найти цитируемый пост)
А в какой книге про "побитовео копирование" написано? Автору руки вправить надо

В Дейтеле, Глава 8, все ясно разобрано. И класс String есть...

Цитата(Ice08 @  20.6.2008,  14:10 Найти цитируемый пост)
чуть доделал заработало.

Неправильно работало, точнее операция присваивания,операция сложения.
Вот поправил все, добавил конструктор копии и операцию <<
Код

#include <stdio.h>
#include <iostream.h>
#include <string.h>
#include <assert.h>

class string {
    friend ostream& operator<<(ostream &,const string &);
public:
      string(const char * = " ");
      string  operator+(const string &);
      const string& operator=(const string &);
     string(const string&);
      ~string();
private:
        char *ptr;
        int lenght;


};
ostream& operator<<(ostream &s,const string &x)
{
return s<<x.ptr<<endl;
}
string::string(const string &x)
{
lenght=x.lenght;
ptr=new char[lenght+1];
assert(ptr);
strcpy(ptr,x.ptr);
}
string :: string(const char *s){

lenght = strlen(s);
ptr = new char[lenght+1];

strcpy(ptr,s);

}

string :: ~string(){ delete [] ptr; }

string  string :: operator+(const string &obj2)
{
string t;
t.lenght=lenght+obj2.lenght;
delete [] t.ptr;
t.ptr=new char [t.lenght+1];
strcpy(t.ptr,ptr);
strcat(t.ptr,obj2.ptr);
return t;
}
const string &string :: operator=(const string &temp)
{
if(&temp!=this)
{
delete [] ptr;
lenght=temp.lenght;
ptr=new char[lenght+1];
assert(ptr);
strcpy(ptr,temp.ptr);
}
return *this;
}
int main()
 {
  string ob1("Hello"), ob2("World"),ob3;

  ob3 = ob1+ob2;
  cout<<ob3;
string ob4=ob3+ob2;

cout<<ob4;

return 0;

}

Нормально прочитай перегрузку операции. smile 

Это сообщение отредактировал(а) IKM2007 - 20.6.2008, 21:26


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
Ice08
Дата 20.6.2008, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Нормально прочитай перегрузку операции.  


наверно ты прав, нужно внимательней прочитать
PM WWW   Вверх
Daevaorn
Дата 20.6.2008, 22:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(IKM2007 @  20.6.2008,  22:24 Найти цитируемый пост)
В Дейтеле, Глава 8, все ясно разобрано

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

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

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

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

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


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

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


 




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


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

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