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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2013, 14:37   #1
Mixam19
 
Регистрация: 17.11.2013
Сообщений: 5
По умолчанию Проблема с перегрузкой оператора

Привет всем. Надеюсь, что у меня простая проблема и я проглядел что-то незначительное. Сначала выкладываю код, потом объясню суть проблемы:

Код:
#include "stdafx.h"
#include <iostream>

using namespace std;

class container {
private:
	float m, t;
	int C;
public:
	container() {C=4200; t=0; m=0;}
	void input();
	void input(int N);
	container calc(container *cont);
	void output(container result);
	container operator+ (container x);
};

container *cont;
int N;

int _tmain(int argc, _TCHAR* argv[])
{  
	setlocale( LC_ALL,"Russian" );

	container result;

	cout << "Данная программа решает задачу на теплообмен при смешивании разного колличества воды разной температуры.\n";
	
	int n;
	
	cout << "По умолчанию колличество смешиваемых сосудов = 2. Если хотите изменить кол-во - введите 1\n";
	cin >> n;
	if (n!=1) result.input();
	else {
		cout << "Введите колличество сосудов: ";
		cin >> N;
		while (N<2)
		{
			cout << "Вы ввели некорректное число. Повторите ввод: ";
			cin >> N; 
		}
		result.input(N);
	}

	result=result.calc(cont);
	
	result.output(result);

	system ("pause");
	return 0;
}

container container::operator+(container x)
{
	container temp;
	temp.m=x.m+m;
	temp.t=(C*m*t+x.C*x.m*x.t)/(C*m+x.C*x.m);
	return temp;
}

void container::input()
{
	cont = new container[1]; 
	cout << "\nВведите массу первого сосуда с водой (в кг): ";
	cin >> cont[0].m;
	cout << "Введите массу второго сосуда с водой (в кг): ";
	cin >> cont[1].m;
	cout << "Введите температуру первого сосуда с водой (в цельсиях, от 0 до 100): ";
	cin >> cont[0].t;
	cout << "Введите температуру второго сосуда с водой (в цельсиях, от 0 до 100): ";
	cin >> cont[1].t;
	N=2;
}

void container::input(int N)
{
	cont = new container[N-1];
	
	for (int i=0; i<N; i++)
	{
		cout << "Введите массу " << i+1 << "го сосуда с водой (в кг): ";
		cin >> cont[i].m;
	}

	for (int i=0; i<N; i++)
	{
		cout << "Введите температуру " << i+1 << "го сосуда с водой (в цельсиях, от 0 до 100): ";
		cin >> cont[i].t;
	}
}

container container::calc(container *cont)
{
	container result;
	result=cont[0];
	cout << result.t << "\n"; 
	for (int i=1; i<N; i++)
	{
		result=result+cont[i];
		cout << result.t << "\n";
	}
	return result;
}

void container::output(container result)
{
	cout.precision(2);
	cout.setf(ios::fixed);
	cout << "Итоговая масса\t"<< "Итоговая температура\n";
	cout << result.m << " кг\t\t" << result.t << "C\n\n";
}
В чём собственно проблема. При сложении объектов в цикле for функции calc, итоговый объект получает температуру последнего из складываемых объектов, а должен получать температуру из формулы в перегрузке. Масса же считается корректно. Экспериментальным путем было выведено, что в формуле ошибок нет и температура корректно считается до тех пор, пока не прибавиться последний объект.
Если что-то не понятно - говорите, я дополню.

Последний раз редактировалось Stilet; 17.11.2013 в 16:27.
Mixam19 вне форума Ответить с цитированием
Старый 17.11.2013, 15:14   #2
Mixam19
 
Регистрация: 17.11.2013
Сообщений: 5
По умолчанию

Проблема решена добавлением пустого элемента в массив объектов.
Тем не менее, буду признателен, если кто-то объяснит, почему это помогло. Ибо решение было выведено путем проб и ошибок ).
Mixam19 вне форума Ответить с цитированием
Старый 18.11.2013, 06:35   #3
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

1. Аргументами операторов практически всегда должны быть ссылки (container operator+ (container &x); ), у тебя же всегда создается копия объекта.
2. В методе container.input() ты создаешь массив из одного элемента, а используешь два Аналогично, для этого же метода с параметром, какого, прости, ты создаешь массив меньше требуемого на один элемент???

Последний раз редактировалось nikmoon; 18.11.2013 в 06:42.
nikmoon вне форума Ответить с цитированием
Старый 24.11.2013, 14:32   #4
Mixam19
 
Регистрация: 17.11.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от nikmoon Посмотреть сообщение
1. Аргументами операторов практически всегда должны быть ссылки (container operator+ (container &x); ), у тебя же всегда создается копия объекта.
2. В методе container.input() ты создаешь массив из одного элемента, а используешь два Аналогично, для этого же метода с параметром, какого, прости, ты создаешь массив меньше требуемого на один элемент???
1. Окей, спасибо.
2. Почему массив одного элемента? "cont = new container[1];". Создаются элементы cont[0] и cont[1]. Или я что-то не так понимаю?
Mixam19 вне форума Ответить с цитированием
Старый 24.11.2013, 16:02   #5
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

При создании массива в квадратных скобках указывается количество элементов.
nikmoon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с перегрузкой операторов Furchtlos Общие вопросы C/C++ 26 28.12.2011 01:39
проблема с перегрузкой оператора потока в классах - << monolit111 Общие вопросы C/C++ 13 27.11.2011 20:40
Проблема с перегрузкой операторов в C++ StudentofSUSU Помощь студентам 2 30.09.2010 10:04
Проблема с перегрузкой операторов, не могу разобраться mrLee Помощь студентам 1 30.01.2010 00:23
В конструкторе выделяется память под массив. Как быть с перегрузкой оператора = ? TwiX Общие вопросы C/C++ 6 15.12.2009 12:18