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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка операций 
:(
    Опции темы
Spegulo
Дата 26.6.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет!
Столкнулся со странной вещью.
Есть класс
Код

class String{
private:
    char   *charBuffer;
    int    charCount;
    time_t timeStamp;
    void setTimeStamp();
public:
    String();
    String(String&);
    String(char *newString);
    ~String();
    void setString(char *newString);
    char *getString();
    int getSubstr(char *subString);

    String &operator +(char *);
    String &operator +(String);
friend String &operator +(char *, String);

    void dumpString();
};
................................
String &operator +(char *leftString, String rightString){
    cout << "call for &operator +(char *leftString, String rightString)\n";
    String *resStr = new String;
    resStr->setString(strcat(leftString, rightString.charBuffer));
    return *resStr;
}

Программа
Код

.....
    String  str_01 = String("Hello byte!");
    str_01 = "Maybe" + str_01;    
    str_01.dumpString();
.....

При попытке вызова  resStr->setString(strcat(leftString, rightString.charBuffer)); вылетает ошибка "нарушение прав доступа". Причем, если делать
Код

resStr->setString(leftString);
или
resStr->setString(rightString.charBuffer);

Ошибка не вылетает и все отрабатывает предсказуемо. 
Почему так?smile
PM MAIL ICQ   Вверх
zim22
Дата 26.6.2009, 11:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Spegulo @  26.6.2009,  11:50 Найти цитируемый пост)
Почему так?

Цитата(Spegulo @  26.6.2009,  11:50 Найти цитируемый пост)
 str_01 = "Maybe" + str_01;  

Цитата(Spegulo @  26.6.2009,  11:50 Найти цитируемый пост)
resStr->setString(strcat(leftString, rightString.charBuffer));

Mybe - это константный строковый литерал, а не массив символов. вы не имеет права к нему добавлять символы.



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


Новичок



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

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



Цитата(zim22 @ 26.6.2009,  14:57)
Mybe - это константный строковый литерал, а не массив символов. вы не имеет права к нему добавлять символы.

Так подобная операция в принципе не реалезуема? Я не специалист в Си, но как из книжек понял, можно и "правые" и "левые" операции перегрузить, плюс в лабах у меня задание именно так и звучит smile
PM MAIL ICQ   Вверх
Fazil6
Дата 26.6.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Spegulo @  26.6.2009,  16:02 Найти цитируемый пост)
Так подобная операция в принципе не реалезуема?

все реализуемо, но надо делать правильно. Вопервых перегружать 
Код

String operator +(const char *leftString, const String &rightString)

Тогда твой неправильный код просто не скомпилируется.
А неправильно впервую очередь вот здесь
Код

resStr->setString(strcat(leftString, rightString.charBuffer));

strcat пишет в первый аргумент, но в тот, что у тебя писать нельзя
Код

String operator +(const char *leftString, const String &rightString){
    std::cout << "call for &operator +(const char *leftString, const String &rightString)\n";
    String resStr;
    char *buf = new char[ strlen(leftString) + rightString.charCount + 1  ];
    buf[0] = '\0' ;
    strcat(buf, leftString);
    resStr = strcat(buf, rightString.c_str());
    delete [] buf;
    return resStr;
}


и еще при наличии конструктора 
Код

String(char *newString);

вполне достаточно перегрузки
Код

friend String operator +(const String &, const String &);

а не 
Код

    String &operator +(char *);
    String &operator +(String);
friend String &operator +(char *, String);

operator+ не должен возвращать ссылку
PM MAIL   Вверх
Spegulo
Дата 26.6.2009, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Fazil6 @ 26.6.2009,  20:13)

и еще при наличии конструктора 
Код

String(char *newString);

вполне достаточно перегрузки
Код

friend String operator +(const String &, const String &);

а не 
Код

    String &operator +(char *);
    String &operator +(String);
friend String &operator +(char *, String);


Ну, это требования лабы smile
Цитата(Fazil6 @ 26.6.2009,  20:13)

operator+ не должен возвращать ссылку

Почему? У меня только так и получилось заставить все это работать.

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


Эксперт
****


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

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



Цитата

Цитата


operator+ не должен возвращать ссылку



Почему? У меня только так и получилось заставить все это работать.
По "понятиям") На самом деле всем пофиг что ты вернешь, до тех пор пока им не придется работать с твоим кодом.
Суть такая: если есть два числа a,b то результатом сложения ожидается НОВОЕ число c, а не измененное a или b или ссылка на локальную переменную из operator= (последнее грубейшая ошибка).

Кроме того: как вы будете заботится об удалении выделенной память (которую вернули как ссылку фактически)?

А также : что насчет a+b+z выражений ? (у вас будет утечка).


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


Новичок



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

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



Ясно smile
Си - не мой профиль. Надеюсь текущий код прокатит, переделывать уже не когда.
Спасибо за помощь.
PM MAIL ICQ   Вверх
baldina
Дата 26.6.2009, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

class String{
private:
    char   *charBuffer;
    int    charCount;
    time_t timeStamp;
    void setTimeStamp();
public:
    String();
    String(String&);
    String(char *newString);
    ~String();
    void setString(char *newString);
    char *getString();
    int getSubstr(char *subString);
    //String &operator +(char *);
    //String &operator +(String);

    String& operator=(const String& s) 
    { 
      this->~String();
      new (this) String(const_cast<String&>(s));
      return *this;
    }
    String &operator += (const String& str)
    {
       char *ptr = new char[charCount+str.charCount+1];
       strcpy (ptr, getString ());
       strcpy (ptr+charCount, str.charBuffer);
       setString (ptr);
       delete [] ptr;
       return *this;
    }

//friend String &operator +(char *, String);
    void dumpString();
};

String operator + (const String & leftString, const String& rightString)
{
    //cout << "call for &operator +(char *leftString, String rightString)\n";
    String resStr (const_cast<CString&> leftString);
    resStr += rightString;
    return resStr;
}


попробуй.
(странность расстановки const и реализации operator= связаны с неизвестностью реализации конструкторов)

а возникающая ошибка не столько с С/С++ связана, сколько с тем, что константы (в т.ч. строковые литералы) хранятся в сегменте памяти только для чтения и процессор отслеживает попытку записи туда.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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