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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2012, 03:40   #1
Sergey S
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 10
По умолчанию Перегрузка оператора (C++)

Пытаюсь откомпилировать следующий код с помощью mingw32 :
Код:
#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;

class sample {
  char *s;
public:
  sample(); // normal constructor
  sample(const sample &ob); // copy constructor
  ~sample( ) { if(s) delete [] s; cout << "Freeing s\n"; }
  void show() { cout << s << "\n"; }
  void set(char *str);
  sample operator=(sample &ob); // overload assignment
};

// Normal constructor.
sample::sample()
{
  cout << "making class \n";
  s = new char('\0'); // s points to a null string.
}

// Copy constructor.
sample::sample(const sample &ob)
{
  cout << "making copy of class \n";
  s = new char[strlen(ob.s)+1];

  strcpy(s, ob.s);
}

// Load a string.
void sample::set(char *str)
{
  s = new char[strlen(str)+1];

  strcpy(s, str);
}

// Overload assignment operator.
sample sample::operator=(sample &ob)
{
  /* If the target string is not large enough
     then allocate a new string. */
  if(strlen(ob.s) > strlen(s)) {
    delete [] s;
    s = new char[strlen(ob.s)+1];
  }
  strcpy(s, ob.s);
  return *this;
}

// Return an object of type sample.
sample input()
{
  char instr[80];
  sample str;

  cout << "Enter a string: ";
  cin >> instr;

  str.set(instr);
  return str;
}

int main()
{
  sample ob;

  // assign returned object to ob
  ob = input();  // This is now OK
  ob.show();

  return 0;
}
на что компилятор выдаёт:
Код:
\overloading\main.cpp||In function 'int main()':|
\overloading\main.cpp|73|error: no match for 'operator=' in 'ob = input()()'|
\overloading\main.cpp|43|note: candidates are: sample sample::operator=(sample&)|
||=== Build finished: 1 errors, 0 warnings ===|
взял из книги Г.Шилдта, добавил пару строк всего.
Sergey S вне форума Ответить с цитированием
Старый 08.01.2012, 08:21   #2
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Код:
sample& operator=(sample &ob);
Возвращайте ссылку на объект, а не сам объект.

Код:
sample& sample::operator=(sample &ob)
{
  /* If the target string is not large enough
     then allocate a new string. */
  if(strlen(ob.s) > strlen(s)) {
    delete [] s;
    s = new char[strlen(ob.s)+1];
  }
  strcpy(s, ob.s);
  return this;
}
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 08.01.2012 в 08:27.
MooNDeaR вне форума Ответить с цитированием
Старый 08.01.2012, 09:14   #3
ERAGORN
Пользователь
 
Аватар для ERAGORN
 
Регистрация: 02.01.2012
Сообщений: 46
По умолчанию

Определите фактический параметр operator= как константную ссылку.

Я магу ошибатся. Инструкция "ob = input();" выполняется в следующей последовательности:
1)вызывается функция input(), возвращенное значение сохраняется во временной переменной созданой компилятором - ob = input(); ==> ob = tempSample;
2)Вызывается operator= объекта который находится слева от знака =, с аргументом который справа от знака.
т.е operator= получает в качестве аргумента временную переменную, а определение фактического параметра просто ссылкой позволяет функции изменять значение временной переменой, чего не допускается.
ERAGORN вне форума Ответить с цитированием
Старый 08.01.2012, 12:25   #4
Sergey S
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 10
По умолчанию

Цитата:
Сообщение от MooNDeaR Посмотреть сообщение
Код:
sample& operator=(sample &ob);
Возвращайте ссылку на объект, а не сам объект.

Код:
sample& sample::operator=(sample &ob)
{
  /* If the target string is not large enough
     then allocate a new string. */
  if(strlen(ob.s) > strlen(s)) {
    delete [] s;
    s = new char[strlen(ob.s)+1];
  }
  strcpy(s, ob.s);
  return this;
}
так не работает, выдаёт
Цитата:
\overloading\main.cpp||In member function 'sample& sample:perator=(sample&)':|
\overloading\main.cpp|52|error: invalid initialization of non-const reference of type 'sample&' from a temporary of type 'sample* const'|
\overloading\main.cpp||In function 'int main()':|
\overloading\main.cpp|73|error: no match for 'operator=' in 'ob = input()()'|
\overloading\main.cpp|43|note: candidates are: sample& sample:perator=(sample&)|
||=== Build finished: 2 errors, 0 warnings ===|
Sergey S вне форума Ответить с цитированием
Старый 08.01.2012, 12:47   #5
Sergey S
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 10
По умолчанию

Цитата:
Сообщение от ERAGORN Посмотреть сообщение
Определите фактический параметр operator= как константную ссылку.

Я магу ошибатся. Инструкция "ob = input();" выполняется в следующей последовательности:
1)вызывается функция input(), возвращенное значение сохраняется во временной переменной созданой компилятором - ob = input(); ==> ob = tempSample;
2)Вызывается operator= объекта который находится слева от знака =, с аргументом который справа от знака.
т.е operator= получает в качестве аргумента временную переменную, а определение фактического параметра просто ссылкой позволяет функции изменять значение временной переменой, чего не допускается.
так он уже по ссылке передаётся, параметр то этот, разве нет ?
Sergey S вне форума Ответить с цитированием
Старый 08.01.2012, 12:58   #6
Sergey S
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 10
По умолчанию

сделал вот так,
Код:
sample sample::operator=(const sample *ob)
{
  /* If the target string is not large enough
     then allocate a new string. */
  if(strlen(ob->s) > strlen(s)) {
    delete [] s;
    s = new char[strlen(ob->s)+1];
  }
  strcpy(s, ob->s);
  return *this;
}
ERAGORN, если Вы это имели ввиду, спасибо
Sergey S вне форума Ответить с цитированием
Старый 08.01.2012, 13:01   #7
Sergey S
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 10
По умолчанию

А в общеобразовательных целях, как понимать, что код из книжек не работает ? Что тому виной ? Новые стандарты какие-то ?
Sergey S вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перегрузка оператора + nesss Помощь студентам 0 01.11.2011 02:23
перегрузка оператора ++ nhr Общие вопросы C/C++ 1 04.05.2011 23:32
перегрузка оператора << z3rg Общие вопросы C/C++ 18 02.03.2010 02:58
Перегрузка оператора + z3rg Общие вопросы C/C++ 1 22.03.2009 03:06
Перегрузка оператора + (С++) MjRed Помощь студентам 1 15.12.2008 18:57