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

Обращение к данным класса. - C++

Восстановить пароль Регистрация
 
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
01.08.2010, 18:11     Обращение к данным класса. #1
Доброе время суток.
Начал самостоятельно изучать классы.
Хотел выполнить задание, но возникла первая трудность.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
class Rectangle {
public:
    Rectangle ();
    //int Perimeter (int, int);
    //int Area (int, int);
private:
    int lenght;
    int width;
};
 
Rectangle::Rectangle ()
{
    lenght=width=0;
}
 
int main (void)
{
    Rectangle TEST;
 
    return 0;
}
Мы имеет класс прямоугольник. Две функции-элемента: вычисление периметра и вычисление площади.
В каждую передается два значения типа int.
Собственно вопроc: Как нам использовать private данные lenght и width, если функциям и так будут передавать значения?

Просто прошу объяснить. Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rrrFer
Заблокирован
01.08.2010, 18:25     Обращение к данным класса. #2
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
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
 
class Rectangle {
public:
    Rectangle ();
    Rectangle (int l, int w);
    void Set (int l, int w);
    int Perimeter ();
    int Area ();
private:
    int lenght;
    int width;
};
 
Rectangle::Rectangle (){
    lenght=width=0;
}
Rectangle::Rectangle (int l, int w){
    lenght=l;
    width=w;
}
void Rectangle::Set (int l, int w){
    lenght=l;
    width=w;
}
int Rectangle::Perimeter (){
    return 2*(lenght+width);
}
int Rectangle::Area (){
    return lenght*width;
}
int main (void){
    Rectangle *t,*tt;
    t=new Rectangle();
    tt=new Rectangle(2,3);
    t->Set(4,5);
    cout<<t->Area()<<" "<<t->Perimeter()<<endl;
    cout<<tt->Area()<<" "<<tt->Perimeter()<<endl;
    cin.get();
 
    return 0;
}
подойдет?

Добавлено через 5 минут
Цитата Сообщение от neske Посмотреть сообщение
Просто прошу объяснить. Спасибо.
Для задания полей добавлен метов Set и конструктор с параметрами. Функция вычисления площади является методом класса, значит имеет доступ к private полям, поэтому возможно написать просто:
C++
1
return lenght*width;
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.08.2010, 18:26     Обращение к данным класса. #3
Цитата Сообщение от neske Посмотреть сообщение
Собственно вопроc: Как нам использовать private данные lenght и width, если функциям и так будут передавать значения?
во-первых сделай значения беззнаковыми, ибо отрицательной длина вряд ли сможет быть.
во-вторых за меня уже все сказали, функции вычисления параметра и площади не должны принимать аргументы, а должны работать на основании данных самого класса и просто возвращать значения. функции вычисления параметра и площади я бы сделал константными.
зы. еще добавь методы SetSize и GetSize для управления размерами прямоугольника.
rrrFer
Заблокирован
01.08.2010, 18:27     Обращение к данным класса. #4
в конце надо конечно выполнить
C++
1
2
    delete t;
    delete tt;
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
01.08.2010, 18:31  [ТС]     Обращение к данным класса. #5
rrrFer, спасибо. С вашим вариантом разберусь чуть позже.

Щас я додумал немного, укажите на ошибку мне:

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
#include <iostream>
 
class Rectangle {
public:
    Rectangle ();
    void set (int, int);
    int Perimeter ();
    int Area ();
private:
    int lenght;
    int width;
};
 
Rectangle::Rectangle ()
{
    lenght=width=0;
}
 
Rectangle::set (int l, int w)
{
    lenght=l;
    width=w;
}
 
Rectangle::Perimeter ()
{
    return 2*(lenght+width);
}
 
Rectangle::Area ()
{
    return (lenght*width);
}
 
 
int main (void)
{
    Rectangle TEST;
    TEST.set (5, 10);
 
    std::cout << "Perimeter: " << T.Perimeter << std::endl;
    std::cout << "Area: " << T.Area << std::endl;
 
    return 0;
}
fasked, на счет этого понял, спасибо.

Добавлено через 3 минуты
А зачем в данном варианте память выделяется динамически?
rrrFer
Заблокирован
01.08.2010, 18:32     Обращение к данным класса. #6
neske,
C++
1
[B]void [/B]Rectangle::set (int l, int w){
пропущено void
C++
1
[B]int [/B]Rectangle::Perimeter (){
пропущено Int и т.д.
C++
1
 std::cout << "Perimeter: " << T.Perimeter << std::endl;
наверное не T а TEST
C++
1
TEST.Perimeter[B]()[/B]
периметр - это функция, значит для вызова нужны скобочки
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
01.08.2010, 18:34  [ТС]     Обращение к данным класса. #7
rrrFer, спасибо =)
Все понял.

Добавлено через 42 секунды
C++
1
2
Rectangle (int l, int w);
        void Set (int l, int w);
А зачем вы делали конструктор и функцию с одинаковым назначением?
rrrFer
Заблокирован
01.08.2010, 18:35     Обращение к данным класса. #8
neske,
А зачем в данном варианте память выделяется динамически?
чтобы использовать конструктор с параметрами. Если использовать Set для установки параметров прямоугольника то можно выделить память статически
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.08.2010, 18:37     Обращение к данным класса. #9
Цитата Сообщение от rrrFer Посмотреть сообщение
чтобы использовать конструктор с параметрами.
чтобы использовать конструктор с параметрами вовсе не обязательно выделять память динамически
rrrFer
Заблокирован
01.08.2010, 18:40     Обращение к данным класса. #10
neske,
А зачем вы делали конструктор и функцию с одинаковым назначением
Конструктором установить начальное значение, методом Set изменить значение.

Добавлено через 2 минуты
fasked, да
надо больше спать
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
01.08.2010, 18:53  [ТС]     Обращение к данным класса. #11
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
#include <iostream>
 
class Rectangle {
public:
    Rectangle ();
    void set (int, int);
    int Perimeter () const;
    int Area () const;
private:
    size_t lenght;
    size_t width;
};
 
Rectangle::Rectangle ()
{
    lenght=width=0;
}
 
void Rectangle::set (int l, int w)
{
    lenght=l;
    width=w;
}
 
int Rectangle::Perimeter () const
{
    return 2*(lenght+width);
}
 
int Rectangle::Area () const
{
    return (lenght*width);
}
 
 
int main (void)
{
    Rectangle TEST;
    TEST.set (5, 10);
 
    std::cout << "Perimeter: " << TEST.Perimeter () << std::endl;
    std::cout << "Area: " << TEST.Area () << std::endl;
 
    return 0;
}
Ключевое слово const значит, что из функций-методов Perimeter и Area будут возвращены константные значения. Так?
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
01.08.2010, 19:01     Обращение к данным класса. #12
Это значит что эти функции не имеют права изменять данные с которыми они работают ( в данном случаи это lenght и width)
rrrFer
Заблокирован
01.08.2010, 19:16     Обращение к данным класса. #13
neske, внутри const метода поля класса константны, добавить таким образом const можно чтобы получить сообщение об ошибке от компилятора если вдруг при вычислении площади значение стороны прямоугольника изменится.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2010, 20:22     Обращение к данным класса.
Еще ссылки по теме:

Обращение к методам класса через указатель на экземпляр класса C++
C++ Наследование классов. Доступ к данным базового класса
C++ Обращение в методах класса к полям класса

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

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.08.2010, 20:22     Обращение к данным класса. #14
Цитата Сообщение от rrrFer Посмотреть сообщение
внутри const метода поля класса константны
Это не совсем верно, константен указатель this, а не данные.
Yandex
Объявления
01.08.2010, 20:22     Обращение к данным класса.
Ответ Создать тему
Опции темы

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