Форум программистов, компьютерный форум CyberForum.ru

Член-функция класса не работает - C++

Восстановить пароль Регистрация
 
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
18.12.2009, 22:42     Член-функция класса не работает #1
Доброго вечера! Только что написал вот такой несложный класс, который определяет две характеристики предмета (вес и стоимость). Обнаружилась проблема, которая заключается в том, что при вводе этих характеристик посрдством член-функии ввода input, они, эти самые характристики как бы не запоминаются. Обнаружил это потому что пытался вывести их, но выводится бред.
Может что-то с конструктором не то, может функция input криво написана, не знаю.

Вот класс.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
typedef unsigned int unt;
 
class thing
{
 public: unt weight, cost, N[8]; //Вес, стоимость предмета, 8 - количество шагов.
 thing (unt, unt); //Конструктор №1.
 thing (); //Конструктор №2.
 void input (unt, unt); //Ввод масс и стоимостей.
 void output (unt, unt); //Вывод масс и стоимостей.
 thing& operator = (const thing &t1)  //Перегрузка оператора присваивания.
 {
  weight = t1.weight; cost = t1.cost;
  for (int i=0; i<8; i++) N[i]=t1.N[i];
  return *this;
 }
};//class thing.
 
thing::thing (unt w, unt c) //Конструктор №1 (Определение).
{
 weight = w; cost = c;
 for (int i=0; i<8; i++) N[i]=0;
}//konstruktor thing.
 
thing::thing () //Конструктор №2 (Определение).
{
 weight = cost = 0;
 for (int i=0; i<8; i++) N[i]=0;
}//konstruktor thing.
 
void thing::input (unt w, unt c)
{
 cout <<"\nМасса: ";
 cin >>w;
 weight = w;
 cout <<"Стоимость: ";
 cin >>c;
 cost = c;
}//input.
 
 
void thing::output (unt w, unt c)
{
 weight = w; cost = c;
 cout <<"Данные о предметах.\n"<<w<<" ("<<c<<")";
}//output.
Вот такой код работает:
C++
1
2
3
thing t1;
t1.cost = 20; t1.weight=50;
t1.output(t1.cost, t1.weight);
А вот такой нет (выводится, но бред):
C++
1
2
3
4
int a, b;
thing t1;
t1.input (a, b);
t1.outpit (a, b);
Стало быть функция вывода работает исправно, а вот ввод нет.
В чем моя ошибка?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Том Ардер
Модератор
 Аватар для Том Ардер
3618 / 2237 / 271
Регистрация: 15.06.2009
Сообщений: 3,917
19.12.2009, 00:28     Член-функция класса не работает #2
Цитата Сообщение от Red Planet Посмотреть сообщение
int a, b; thing t1; t1.input (a, b); t1.outpit (a, b);
Чтобы это работало. надо
C++
1
2
3
void thing::input(unt* pa, unt* pb);
.............
t1.input (&a, &b);
Непонятки в другом: зачем вообще параметры в input(), output() ?

Добавлено через 12 минут
Да ещё: параметры в описании этих функций и их применении перепутаны

Функция должна заниматься только выводом, а не переопределять переменные класса
C++
1
2
3
4
void thing::output()
{
  cout << weight << cost;
}
input - аналогично

Применение:

C++
1
2
3
4
thing t1(50, 20);  // weight = 50, cost = 20
 
t1.input();  // ввод новых значений
t1.output();
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
19.12.2009, 14:54  [ТС]     Член-функция класса не работает #3
Том Ардер, спасибо огромное!

Цитата Сообщение от Том Ардер Посмотреть сообщение
Непонятки в другом: зачем вообще параметры в input(), output() ?
Новичок, что сказать!

Цитата Сообщение от Том Ардер Посмотреть сообщение
параметры в описании этих функций и их применении перепутаны
Случайно перепутал, но это не принципиально, всего лишь местами поменять.

Сделал вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void thing::input ()
{
 cout <<"\nГЊГ*Г±Г±Г*: ";
 cin >>weight;
 cout <<"Ñòîèìîñòü: ";
 cin >>cost;
}//input.
 
void thing::output ()
{
 cout <<"\n"<<weight<<" ("<<cost<<")";
}//output.
//Код программы...........................................
 
thing t1;
  t1.input();
  t1.output ();
Параметры и вправду были лишними.
System16v
 Аватар для System16v
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 115
29.05.2015, 16:23     Член-функция класса не работает #4
Подскажите пожалуйста, сделал композицию элемент-объект, запускается,работает. Попытался использовать функцию для изменения параметра,а оно не работает. Т.е. все запускается,но значение не меняется,выводит предыдущее значение(начальное).Почему так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <cstdlib.h>
#include <iomanip>
#include "Unit3.h"
 
using namespace std;
 
int main()
{
 
  BasePlusCommissionEmployee b(300);
  CommissionEmployee c("Bob","Lewis","333-33-3333",b,5000,.04);
 
  cout << endl;
  c.print();
  cout << "\nZarplata: " << c.earnings() << endl << endl;
 
  b.setBaseSalary(400); // ПОПЫТКА ПОМЕНЯТЬ ЗАРПЛАТУ, ВЫВОДИТ НИЖЕ ВСЕ РАВНО СТАРОЕ ЗНАЧЕНИЕ "300" вместо "400"
  c.print();
  cout << "\nZarplata: " << c.earnings();
  cout << endl;
 
 system("pause");
 return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <cstdlib.h>
#include <iomanip>
#include "Unit2.h"
 
using namespace std;
 
BasePlusCommissionEmployee::BasePlusCommissionEmployee(double salary)
{
 setBaseSalary(salary); // проверить и сохранить зарплату
 cout << "BasePlusCommissionEmployee constructor" << endl;
}
BasePlusCommissionEmployee::~BasePlusCommissionEmployee()
{
 cout << "BasePlusCommissionEmployee destructor:" << endl;
 print();
 cout << "\n\n";
}
// установить зарплату
void BasePlusCommissionEmployee::setBaseSalary(double salary)
{
 baseSalary=(salary<0.0) ? 0.0 : salary;
}
 
// возвратить зарплату
double BasePlusCommissionEmployee::getBaseSalary() const
{
 return baseSalary;
}
 
// напечатать объект CommissionEmployee
void BasePlusCommissionEmployee::print() const
{
 cout << "base-salaried ";
 // вызвать функцию print для класса CommissionEmployee
 
 cout << "\nbase salary: " << getBaseSalary();
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <cstdlib.h>
#include <iomanip>
 
using namespace std;
 
#ifndef Unit2H
#define Unit2H
 
class BasePlusCommissionEmployee
{
 public:
  BasePlusCommissionEmployee(double =0.0);
 
  ~BasePlusCommissionEmployee();
  void setBaseSalary(double); // установить основную зарплату
  double getBaseSalary() const; // возвратить основную зарплату
  void print() const; // напечатать объект CommissionEmployee
 private:
  double baseSalary; // основная зарплата
};
//---------------------------------------------------------------------------
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <cstdlib.h>
#include <iomanip>
#include "Unit3.h"
#include "Unit2.h"
 
using namespace std;
 
CommissionEmployee::CommissionEmployee(const string &first,const string &last,
                                     const string &ssn,
                                     const BasePlusCommissionEmployee &bp,
                                     double sales,double rate)
 : firstName(first),lastName(last),socialSecurityNumber(ssn),bpce(bp)
{
 setGrossSales(sales); // проверить и сохранить объем продаж
 setCommissionRate(rate); // проверить и сохранить процент
 cout << "Commission employee constructor" << endl;
}
 
CommissionEmployee::~CommissionEmployee()
{
 cout << "Commission employee destructor:" << endl;
 print();
 cout << "\n\n";
}
// установить имя
void CommissionEmployee::setFirstName(const string &first)
{
 firstName=first; // должно проверяться
}
 
// возвратить имя
string CommissionEmployee::getFirstName() const
{
 return firstName;
}
 
// установить фамилию
void CommissionEmployee::setLastName(const string &last)
{
 lastName=last; // должно проверяться
}
 
// возвратить фамилию
string CommissionEmployee::getLastName() const
{
 return lastName;
}
 
// установить номер страховки
void CommissionEmployee::setSocialSecurityNumber(const string &ssn)
{
 socialSecurityNumber=ssn; // должно проверяться
}
 
// возвратить номер страховки
string CommissionEmployee::getSocialSecurityNumber() const
{
 return socialSecurityNumber;
}
 
// установить общую сумму продаж
void CommissionEmployee::setGrossSales(double sales)
{
 grossSales = (sales<0.0) ? 0.0 : sales;
}
 
// возвратить общую сумму продаж
double CommissionEmployee::getGrossSales() const
{
 return grossSales;
}
 
// установить комиссионный процент
void CommissionEmployee::setCommissionRate(double rate)
{
 commissionRate = (rate>0.0&&rate<1.0) ? rate : 0.0;
}
 
// возвратить комиссионный процент
double CommissionEmployee::getCommissionRate() const
{
 return commissionRate;
}
 
// вычислить зароботок
double CommissionEmployee::earnings() const
{
 return commissionRate*grossSales+bpce.getBaseSalary();
}
 
// напечатать объект CommissionEmployee
void CommissionEmployee::print() const
{
 cout << "commission employee: " << firstName << ' ' << lastName
      << "\nsocial security number: " << socialSecurityNumber
      << "\ngross sales: " << grossSales << "\ncommission rate: "
      << commissionRate << "\nbase salary " << bpce.getBaseSalary();
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <cstdlib.h>
#include <iomanip>
#include "Unit2.h"
 
using namespace std;
#ifndef Unit3H
#define Unit3H
 
class CommissionEmployee
{
 public:
   CommissionEmployee(const string &,const string &,const string &,
                      const BasePlusCommissionEmployee &,double =0,double =0);
   ~CommissionEmployee();
  void setFirstName(const string &); // установить имя
  string getFirstName() const; // возвратить имя
 
  void setLastName(const string &); // установить фамилию
  string getLastName() const; // возвратить фамилию
 
  void setSocialSecurityNumber(const string &); // установить SSN
  string getSocialSecurityNumber() const; // возвратить SSN
 
  void setGrossSales(double); // установить общую сумму продаж
  double getGrossSales() const; // возвратить общую сумму продаж
 
  void setCommissionRate(double); // установить процент
  double getCommissionRate() const; // возвратить процент
 
  double earnings() const; // вычислить зароботок
  void print() const; // напечатать объект CommissionEmployee
 private:
  string firstName;
  string lastName;
  string socialSecurityNumber;
  double grossSales; // продажи за неделю
  double commissionRate; // комиссионный процент
  const BasePlusCommissionEmployee bpce;
};
//---------------------------------------------------------------------------
#endif
Почему функция setBaseSalary() не присваивает новое значение?

Добавлено через 13 минут
Кхм,а если ее впихнуть перед созданием объекта "с" , то значение меняет.... Может кто объяснить,почему если поставить замену после создания объекта, из-за чего он не передается ему с новым значением?И как можно исправить? Кроме того способа,чтоб создать новый объект и снова передать ему объект "b"...Хотел чтоб изменялся старый, или так не получится?
Perfilov
264 / 165 / 43
Регистрация: 25.02.2015
Сообщений: 435
29.05.2015, 17:07     Член-функция класса не работает #5
потому что в конструкторе CommissionEmployee копируется BasePlusCommissionEmployee и эта копия уже не связана с изначальным объектом b. Если вы b меняете после того, как из этого b была сделана копия, то b меняется, а копия остается без изменений. это ведь уже самостоятельный объект.

упрощенный вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Foo()
{
  const int m_i;
 
  public:
    Foo(const int& i)
      : m_i(i)
    {
    }
};
 
 
....
 
 
int ii = 333;
Foo foo(ii);
ii = 666; // мембер m_i внутри foo от этого не меняется и по прежнему равен 333
System16v
 Аватар для System16v
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 115
29.05.2015, 17:10     Член-функция класса не работает #6
Perfilov, Понял. Т.е. получается кроме как передавать заново объект,ничего не сделать?
Gr1f0nn
82 / 81 / 42
Регистрация: 30.09.2012
Сообщений: 408
29.05.2015, 17:17     Член-функция класса не работает #7
Объект с не знает о том, что вы что-то изменили в объекте b , который является объектом другого класса.
Возможно, проблему решит передача объекта по ссылке и хранение его адреса в вашем основном классе. Тогда при изменении объекта b , его адрес ведь не изменится, а значение поменяется, и вы как раз сможете получить то значение, которое вам и надо

Добавлено через 38 секунд
Или передайте объект заново, как вы уже сами предложили
System16v
 Аватар для System16v
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 115
29.05.2015, 17:27     Член-функция класса не работает #8
Gr1f0nn, Спасибо . Помогло, изменил просто строчку
C++
1
const BasePlusCommissionEmployee bpce;
на
C++
1
const BasePlusCommissionEmployee &bpce;
и теперь меняется
Perfilov
264 / 165 / 43
Регистрация: 25.02.2015
Сообщений: 435
29.05.2015, 17:34     Член-функция класса не работает #9
хранить ссылку - опасно. надо будет следить чтобы то, на что она ссылается было живым объектом, а это не удобно.
странно что у вас нет наследования одного объекта от другого. меняли бы с, раз уж это изменение касается с.
второй вариант - сделать метод у CommissionEmployee, который бы возвращал ссылку на внутренний объект BasePlusCommissionEmployee& и менять его:
C++
1
2
c.getBase().setBaseSalary(400);
c.print();
System16v
 Аватар для System16v
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 115
29.05.2015, 19:26     Член-функция класса не работает #10
Perfilov, ну просто по книге Дейтела прохожу главу "Наследование" . Был пример с наследованием, т.е. объект BasePlusCommissionEmployee был производным объекта CommissionEmployee . И было задание переделать наследование в композицию. Я переделал вроде бы....И потом просто решил попробовать изменить объект b и посмотреть результат,а оно что-то не хотело выполняться . Или я что-то таки не правильно переделал?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2015, 20:14     Член-функция класса не работает
Еще ссылки по теме:

C++ Не функция-член класса
C++ Функция-член Ошибка класса
И снова класс Матрицы с функция-член класса для нахождения определителя C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Perfilov
264 / 165 / 43
Регистрация: 25.02.2015
Сообщений: 435
29.05.2015, 20:14     Член-функция класса не работает #11
ну вам уже вроде рассказали что к чему. передали правильно, но там копия запилилась, потому вы меняли что-то другое в надежде что вот эта копия изменится.
Yandex
Объявления
29.05.2015, 20:14     Член-функция класса не работает
Ответ Создать тему
Опции темы

Текущее время: 15:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru