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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2012, 18:26   #1
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию Перегрузка оператора

Здраствуйте всем ! Подкажите пожалуйста:
Есть код
Код:
//---------------------------------------------------------------------------

#pragma hdrstop
#pragma argsused

#include <iostream.h>

class TAge
{
private:
  int FData;
public:
  int operator+(int Value);
  int operator+(TAge Value);
  int operator=(int Value);
};

/* TAge */

int TAge::operator+(TAge Value)
{
  return (this->FData + Value.FData);
};

int TAge::operator=(int Value)
{
  this->FData = Value;
  return this->FData;
};

int TAge::operator+(int Value)
{
  return (this->FData + Value);
};

/* Main module */

int temp;
TAge Me, Mom;

int main(int argc, char* argv[])
{
  Me = 19;
  Mom = 30;
  temp = Me + Mom;
  temp = Me;
  cout << temp << endl;
  cin >> temp;

  return 0;
}
На строчку temp = Me ругается мол разные типы! Какой оператор перегрузить и как чтоб не ругался?
RuVarez вне форума Ответить с цитированием
Старый 08.07.2012, 18:43   #2
rmv240899
Форумчанин
 
Регистрация: 18.02.2012
Сообщений: 155
По умолчанию

У Me тип TAge, Вы пытаетесь присвоить этот объект переменной типа int. А у Вас оператор присваивания со вторым целым параметром перегружен для класса TAge. Перегружать операции для базовых типов нельзя, так что пишите get методы для класса TAge.
rmv240899 вне форума Ответить с цитированием
Старый 08.07.2012, 18:54   #3
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию

Т.с. я не смогу перегрузить оператор, только через метод?
RuVarez вне форума Ответить с цитированием
Старый 08.07.2012, 19:02   #4
rmv240899
Форумчанин
 
Регистрация: 18.02.2012
Сообщений: 155
По умолчанию

Не совсем. Напишите в классе метод, который возвращает значение FData, и присваивайте результат этого метода переменной temp.
rmv240899 вне форума Ответить с цитированием
Старый 08.07.2012, 19:05   #5
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию

Ну так это через функцию, Не красиво получается -
Код:
temp = Me->GetData
Что никак нельзя перегрузить оператор присваивания! Даже Delphi умеет)
RuVarez вне форума Ответить с цитированием
Старый 08.07.2012, 19:21   #6
rmv240899
Форумчанин
 
Регистрация: 18.02.2012
Сообщений: 155
По умолчанию

Оператор присваивания вне класса перегрузить не получится. Тем более для базовых типов вообще нельзя перегружать операции.
Лучше через метод. Тогда это будет выглядеть так:
Код:
temp = Me.getData()
А сам метод должен выглядеть так:
Код:
int getData() const { return FData; }
rmv240899 вне форума Ответить с цитированием
Старый 08.07.2012, 19:29   #7
RuVarez
Форумчанин
 
Аватар для RuVarez
 
Регистрация: 25.08.2010
Сообщений: 258
По умолчанию

Ладно понятно! Спасибо за помощь(
RuVarez вне форума Ответить с цитированием
Старый 11.07.2012, 08:27   #8
ElectroMent
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 27
По умолчанию

Код:
class TAge
{
private:
  int FData;
public:
  TAge( int value = 0 ) : FData( value ) { }
  TAge( const TAge & a ) : FData( a.FData ) { }
  
  TAge & operator=(int Value);
  TAge & operator=(const TAge &a);

  operator int() { return FData; } // Вместо метода GetFData(), оператор приведения типа

  TAge & operator+=(int Value); // Изменил оператор с унарного + на +=
  TAge & operator+=(const TAge &Value);
  
  // добавил друзей, бирнарные операторы + 
  friend TAge operator+(const TAge &a, const TAge &b); 
  friend TAge operator+(const TAge &a, int b);
  friend TAge operator+(int a, const TAge &b);
};

/* TAge */

TAge & TAge::operator=(int Value)
{
  FData = Value;
  return *this;
}

TAge & TAge::operator=(const TAge &a)
{
	if( this != &a)
	{
		FData = a.FData;
	}
	return *this;
}

TAge & TAge::operator+=(int Value)
{
  FData += Value;
  return *this;
}

TAge & TAge::operator+=(const TAge &Value)
{
  FData += Value.FData;
  return (*this);
}

// friends
TAge operator+(const TAge &a, const TAge &b)
{
	TAge res(a);
	res += b;
	return res;
}

TAge operator+(const TAge &a, int b)
{
	TAge res(a);
	res += b;
	return res;
}

TAge operator+(int a, const TAge &b)
{
	TAge res(b);
	res += a;
	return res;
}
теперь твоя конструкция будет работать.

Код:
{
		  Me = 19;
		  Mom = 30;
		  temp = Me + Mom;
		  temp = Me;
		  cout << temp << endl;
		  cin >> temp;
	}

Последний раз редактировалось ElectroMent; 11.07.2012 в 08:32.
ElectroMent вне форума Ответить с цитированием
Старый 11.07.2012, 08:37   #9
ElectroMent
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от rmv240899 Посмотреть сообщение
Оператор присваивания вне класса перегрузить не получится. Тем более для базовых типов вообще нельзя перегружать операции.
Лучше через метод. Тогда это будет выглядеть так:
Код:
temp = Me.getData()
А сам метод должен выглядеть так:
Код:
int getData() const { return FData; }
Такой фигней страдать не нужно, а то можно подумать С++ создавали глупые люди.
ElectroMent вне форума Ответить с цитированием
Старый 11.07.2012, 12:37   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от ElectroMent Посмотреть сообщение
Такой фигней страдать не нужно, а то можно подумать С++ создавали глупые люди.
Глянь ещё раз на собственный код. Присмотрись по внимательнее: что именно ты сделал? И если ты ещё не понял, то ты сделал надстройку над int, которая ничего абсолютно нового к типу данных int не добавила.

Я могу переписать весь твой код всего одной строчкой. И смысл не изменится:

typedef int TAge;

То, что ты сделал, называется "овер инжениринг". Создание бесполезной сущности, трата времени, и излишнее переусложнение кода.

В ситуациях, когда создание очередной сущности себя действительно оправдывает, способ rmv240899 естественно предпочтителен. Ибо однозначен и прост.

Способ "присваивать теплое мягкому" - плохой путь.
Способ "присваивать мягкое мягкому" - "овер инжениринг".
_Bers вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Перегрузка оператора += и >> Jane-sad Помощь студентам 4 01.03.2013 15:38
перегрузка оператора ++ nhr Общие вопросы C/C++ 1 04.05.2011 23:32
перегрузка оператора ++ nhr Помощь студентам 0 04.05.2011 21:20
перегрузка оператора = mcpro Общие вопросы C/C++ 8 04.02.2011 15:28
Перегрузка оператора + (С++) MjRed Помощь студентам 1 15.12.2008 18:57